Package: django-test-toolkit
Django Test Toolkit基于Django提供的一款测试工具箱。Features支持模型测试数据生成支持根据对应数据模型快速生成测试数据支持自定义模型字段生成方式支持配置数据生成时默认值的采用比例支持配置唯一字段数据生成重复值时的重试次数支持快速组合多种生命周期钩子内置account、blueking和drf等多种钩子支持快速自定义钩子并组合使用Quick Start数据生成示例定义模型数据生成工厂类最简单的情况，直接基于字段进行生成：fromdjango_test_toolkit.data_generation.faker_generatorimportDjangoModelFakerFactoryclassClockedTaskFactory(DjangoModelFakerFactory):classMeta:model=ClockedTask如果需要对Model中的特定字段进行自定义，可以对Factory类进行修改：importfactoryclassClockedTaskFactory(DjangoModelFakerFactory):# 开发者自定义特定字段值notify_receivers="fixed value"# 外键字段需要进行指定foreign_field=factory.SubFactory(ForeignModelFactory)classMeta:model=ClockedTask通过工厂类快速生成数据并插入测试数据库clocked_tasks=ClockedTaskFactory.create_batch(10)此时会返回10个clocked_tasks对象，可供后续进行操作。该步骤可以在测试准备阶段进行，如在setUpTestData等。接口测试示例（内置生命周期Mixin使用）fromdjango_test_toolkit.testcasesimportToolkitApiTestCasefromdjango_test_toolkit.mixins.accountimportSuperUserMixinfromdjango_test_toolkit.mixins.bluekingimportLoginExemptMixin,StandardResponseAssertionMixinfromdjango_test_toolkit.mixins.drfimportDrfPermissionExemptMixinclassClockedTaskTestCase(ToolkitApiTestCase,SuperUserMixin,LoginExemptMixin,DrfPermissionExemptMixin,StandardResponseAssertionMixin,):# DrfPermissionExemptMixin需要指定，用于豁免对应权限认证VIEWSET_PATH="gcloud.clocked_task.viewset.ClockedTaskViewSet"@classmethoddefsetUpTestData(cls):super().setUpTestData()# 生成数据并插入数据库cls.clocked_tasks=ClockedTaskFactory.create_batch(10)# 开发者自定义数据准备逻辑...deftest_list_action_fetch_all_objects(self):url=reverse("clocked_task-list")response=self.client.get(url)# 由StandardResponseAssertionMixin提供，用于快速判断是否符合蓝鲸标准下请求成功的返回格式self.assertStandardSuccessResponse(response)# 判断list接口返回条数是否等于数据生成的条数self.assertEqual(len(response.data["data"]),len(self.clocked_tasks))deftest_retrieve_action_fetch_specific_object(self):# 获取生成的第一条数据的idtest_clocked_task=self.clocked_tasks[0]url=reverse("clocked_task-detail",args=[test_clocked_task.id])response=self.client.get(url)self.assertStandardSuccessResponse(response)# 判断retrieve接口请求的数据是否符合预期self.assertEqual(test_clocked_task.task_name,response.data["data"]["task_name"])注意：django_test_toolkit.testcases中的ToolkitApiTestCase或ToolkitTestCase需要放在继承顺序的第一位，将各个生命周期相关Mixin放在后面继承。内置Mixin介绍Mixin名称相关领域作用涉及钩子配置项SuperUserMixin登陆以admin身份登陆系统并进行后续client请求set_up_test_data、set_up、tear_down无DrfPermissionExemptMixinDRF ViewSet用于快速豁免ViewSet权限控制set_upVIEWSET_PATH：测试类变量， 以字符串形式描述对应要豁免的ViewSet的路径LoginExemptMixin蓝鲸豁免蓝鲸登陆校验set_up无StandardResponseAssertionMixin蓝鲸提供蓝鲸标准返回格式快速判断无无Extensions自定义生命周期Mixin如果内置的Mixin无法满足需求，开发者可以基于LifeCycleHooksMixin进行开发，这样就可以让特定的逻辑与内置Mixin一样在对应的生命周期中被自动执行，可以大量复用于各个TestCase测试类中，也可实现多个Mixin的组合使用。下面以内置生命周期Mixin：SuperUserMixin为例介绍如何进行自定义：fromdjango_test_toolkit.mixins.baseimportLifeCycleHooksMixinclassSuperUserMixin(LifeCycleHooksMixin):MOCK_SUPERUSER_NAME="admin"MOCK_SUPERUSER_PASSWORD="admin"@classmethoddefset_up_test_data(cls):user_model=get_user_model()try:cls.superuser=user_model.objects.get(username=cls.MOCK_SUPERUSER_NAME)exceptuser_model.DoesNotExist:cls.superuser=user_model.objects.create(username=cls.MOCK_SUPERUSER_NAME,password=cls.MOCK_SUPERUSER_PASSWORD,is_superuser=True,is_staff=True,is_active=True,)defset_up(self):self.client.force_login(user=self.superuser)deftear_down(self):self.client.logout()需要继承LifeCycleHooksMixin支持Django Test默认提供的生命周期钩子：set_up_test_data、set_up_class、tear_down_class、set_up、tear_down在特定钩子中进行开发数据生成配置项对于模型字段数据生成，django_test_toolkit中提供的默认配置：DEFAULT_FIELD_TO_FAKER_CONFIG={"fields":{"CharField":{"provider":"text","processing_func":text_provider_char_field_processing},"TextField":{"provider":"text"},"IntegerField":{"provider":"random_int","processing_func":random_int_provider_integer_field_processing},"DateTimeField":{"provider":"date_time_this_month","extra_kwargs":{"tzinfo":pytz.utc,"before_now":True},},},"default_value_factor":DEFAULT_DEFAULT_VALUE_FACTOR,"unique_field_duplicate_retry_tolerance":DEFAULT_RETRY_TOLERANCE,}开发者可以在settings中设置变量TEST_TOOLKIT_FAKER_CONFIG来进行自定义配置，各配置项的含义如下表：配置项默认配置配置类型含义fields默认包含:CharFieldTextFieldIntegerFieldDateTimeFielddict各种模型字段的数据生成方式配置fields.xxxField可包含:provider(必填)user_provider_class(选填)processing_func(选填)extra_kwargs(选填)三个字段dict对应模型字段的数据生成方式具体配置fields.xxxField.provider对应关系:CharFiled: textTextField: textIntegerField:random_intDateTimeField:date_time_this_monthstr对应Faker的provider类型，可参考https://faker.readthedocs.io/en/master/providers/baseprovider.html，也可自定义fields.xxxField.user_provider_class(选填)无默认配置faker.Provider类及子类用户自定义provider类fields.xxxField.processing_func(选填)对应配置:CharField: 控制字段数据生成长度IntegerField: 控制字段数据生成值区间函数对象对执行过程中才能确定的模型字段数据生成规则进行一些定制化开发，返回一个字典，将在Faker(provider).generate()中作为extra_kwargs参数fields.xxxField.extra_kwargs(选填)对应配置:DateTimeField: 默认时区为utc, 时间早于当前时间dict对执行前即可确认的数据生成规则进行配置，将在Faker(provider).generate()中作为extra_kwargs参数faker_data_locale(选填)faker默认值，en_USstrfaker数据生成默认使用的locale，需要对应的provider支持default_value_factor0.8float当模型字段配置默认值时生成数据采用默认值的比例unique_field_duplicate_retry_tolerance50int当模型字段配置唯一属性时生成数据重复时的重试次数数据生成自定义Provider基于faker.Provider，开发者可以定义适合业务特性的Provider来生成字段值。为了方便演示，这里以faker官方文档中的DynamicProvider为例:fromfaker.providersimportDynamicProvidermedical_professions_provider=DynamicProvider(provider_name="medical_profession",elements=["dr.","doctor","nurse","surgeon","clerk"],)创建了自定义Provider之后，只需在配置项中指定对应的user_provider_class即可：DEFAULT_FIELD_TO_FAKER_CONFIG={"fields":{"CharField":{"provider":"medical_profession","user_provider_class":medical_professions_provider},...}...}数据生成自定义processing_func因为Model各个字段会有一些自身的约束，为了能让自动生成的数据满足这些约束，有时候需要在faker数据生成过程中添加一些字段的约束逻辑，比如int的取值区间等，下面以random_int_provider_integer_field_processing为例说明应该如何实现自定义processing_func:defrandom_int_provider_integer_field_processing(field):"""传入model field对象作为参数, 返回约束参数字典，作为数据生成过程中的extra_kwargs"""extra_kwargs={}# 从field的校验器中获取最大值和最小值，规定随机取值的区间forvalidatorinfield.validators:ifvalidator.codein["min_value","max_value"]:extra_kwargs[validator.code.replace("_value","")]=validator.limit_valuereturnextra_kwargsRoadmap版本日志Support蓝鲸论坛蓝鲸 DevOps 在线视频教程联系我们，技术交流QQ群：BlueKing CommunityBK-CI：蓝鲸持续集成平台是一个开源的持续集成和持续交付系统，可以轻松将你的研发流程呈现到你面前。BK-BCS：蓝鲸容器管理平台是以容器技术为基础，为微服务业务提供编排管理的基础服务平台。BK-BCS-SaaS：蓝鲸容器管理平台SaaS基于原生Kubernetes和Mesos自研的两种模式，提供给用户高度可扩展、灵活易用的容器产品服务。BK-PaaS：蓝鲸PaaS平台是一个开放式的开发平台，让开发者可以方便快捷地创建、开发、部署和管理SaaS应用。BK-SOPS：标准运维（SOPS）是通过可视化的图形界面进行任务流程编排和执行的系统，是蓝鲸体系中一款轻量级的调度编排类SaaS产品。BK-CMDB：蓝鲸配置平台是一个面向资产及应用的企业级配置管理平台。Contributing如果你有好的意见或建议，欢迎给我们提 Issues 或 Pull Requests，为蓝鲸开源社区贡献力量。腾讯开源激励计划鼓励开发者的参与和贡献，期待你的加入。License基于 MIT 协议， 详细请参考LICENSE