Snyk最近开源了我们的faker-securityPython包,以帮助任何从事安全数据的人。在这篇博文中,我们将简要介绍一下这个Python包是什么以及如何使用它。但首先,我们将了解一些背景,了解factory_boy Python包如何与faker-security 结合使用,以改善你在开发过程中的测试编写经验。
**注意:**对Python有一定的了解有助于从这篇文章中获得更多信息。
使用Faker和factory_boy进行测试
在深入了解faker-security 之前,先看看什么是factory_boy和Faker,以及我们如何在Snyk中使用它们。
Snyk坚信自动化测试的能力可以使我们的代码变得可维护。测试使我们能够快速迭代和开发功能,并自信地对我们的代码进行修改,而不用担心在这个过程中会无意中破坏现有的功能。
我们对测试的承诺促使我们找到新的方法来简化我们团队中测试作者和读者的测试体验。Faker 和factory_boy 是我们最喜欢的两个测试 Python 项目的软件包。 它们一起生成我们在测试中使用的模型的假实例。
Faker factory_boy 是另一个 Python 包,它通过定义工厂类来帮助将 的数据生成集成到你的代码中。Faker
我们特别喜欢factory_boy ,因为它允许测试作者专注于在他们的测试中钉住他们关心的数据,而让Faker 来生成测试不关心的所有其他数据。这大大改善了测试的可读性,因为它减少了所需的代码行数,并消除了你不需要担心的字段的噪音。
要看到实际的区别,请在下面的例子中比较一个用factory_boy 写的测试和一个没有用的测试。
没有工厂
from django.contrib.auth.models import User
def test_correct_email_address():
user = User(
first_name="Sherlock",
last_name="Holmes",
username="sherlock.holmes",
email="sherlock.holmes@baker.street",
is_admin=False,
)
assert has_valid_email(user) is True
有工厂
from tests.factories import UserFactory
def test_correct_email_address():
user = UserFactory(email="sherlock.holmes@baker.street")
assert has_valid_email(user) is True
导入UserFactory 的测试与不导入的测试完全相等。然而,它更短,更容易阅读,并清楚地显示对测试很重要的字段。相比之下,没有工厂的测试比较长,而且让人难以理解哪些字段对测试来说实际上是重要的。这是一个相当简单的例子,但随着测试复杂性的增加,差别变得更加明显。
UserFactory 类可以在tests/factories.py 中定义一次,并在你所有的测试中重新使用。
import factory
from django.contrib.auth.models import User
from factory.django import DjangoModelFactory
class UserFactory(DjangoModelFactory):
class Meta:
model = User
username = factory.Faker("slug")
first_name = factory.Faker("first_name")
last_name = factory.Faker("last_name")
email = factory.Faker("email")
is_admin = False
在处理安全数据时,我们经常需要生成CVSSv3向量和CVE标识符等安全字段的数据。Faker默认没有直接提供这种数据的方法,但它允许你添加自己的提供者,这正是faker-security 的作用。
什么是faker-security?
faker-security是一个Python包,它作为一个Faker 提供者,允许你为你的项目随机生成安全相关的数据。目前,faker-security 支持以下数据的生成。
- CVSSv3向量
- CVSSv2向量
- semver版本
- NPM semver版本范围
- CVEs
- CWEs
在未来,我们希望能涵盖更多的生成方法和版本范围的类型--比如Mavensemver 。
在我们之前的例子基础上,如果我们想创建一个某种类型的VulnerabilityFactory ,以生成假数据,我们会按以下方式定义它。
import factory
from factory.django import DjangoModelFactory
from faker_security.providers import SecurityProvider
from myproject.models import Vulnerability
factory.Faker.add_provider(SecurityProvider)
class VulnerabilityFactory(DjangoModelFatory):
class Meta:
model = Vulnerability
cvss_v3_vector = factory.Faker("cvssv3")
cve_id = factory.Faker("cve")
cwe_id = factory.Faker("cwe")
如何使用faker-security
faker-security 可以通过 来安装。pip
pip install faker-security
如果你想在你的项目中使用它,把它添加到你选择的依赖文件中。这通常是你项目的requirements.txt 文件。如果你使用的是更高级别的软件包管理器,如poetry 或pipenv ,请按照他们的说明添加新的软件包。
一旦安装完毕,你只需要配置Faker 或factory_boy 来使用faker-security 。
factory_boy 如果你用pytest运行测试,我们建议在你的conftest.py 文件中为faker-security ,如下所示。
import factory
from faker_security.providers import SecurityProvider
def pytest_configure():
factory.Faker.add_provider(SecurityProvider)
使用faker-security继续前进
使用factory_boy 和Faker 是简化测试的好方法,有了faker-security,你现在有了一个快速而简单的方法来为你的所有项目生成假的安全数据
我们希望你觉得这个包和我们一样有用,并希望你能做出贡献请把我们的GitHub repo作为明星,并发送拉动请求和贡献。测试愉快!