Django中的单元测试 – 在哪里划线?

我已经经历了很多Django测试教程,但是我有点不确定要测试多少.我主要使用基于分类的视图

例如,在测试我的观点时,我应该检查以下所有内容:

>每个URL映射都是正确的
>所有视图都使用预期的模板
>所有观点均使用预期表格(如适用)
>在每个视图中,预期的上下文变量都在那里
>所有帖子都重定向到某个地方

我的大多数观点都是基于类的视图.我有一个ListView,我在其中设置template_name,model和context_object_name.我应该测试这些设置是否正确?那里没有逻辑,所以测试它似乎有点傻,因为它只是配置.

在测试模型中:

>当一个字段被标记为唯一时,我是否应该测试是否引发了验证错误?我尝试为该字段添加另一个具有相同值的记录?
>如果我在字段中添加MinValueValidator,我应该测试吗?
>我认为应该测试正则表达式验证器,因为那里有逻辑.

在测试表格(特别是模型表格)

>我应该检查表单上的每个字段是否为无效输入生成错误?
>生成错误时检查错误消息是否正确?
>测试模型表格是否正确保存了项目?
>有很多东西可以测试表单中的每个字段,例如help_text,place_holder等.

很多这些测试似乎只是测试配置而不是逻辑.我知道如何测试上面提到的所有项目,但是当使用基于类的视图时,如果我尝试测试所有内容,测试代码可以是实际代码量的10倍.

所以,我目前的想法是只在我的应用程序中测试我添加逻辑的位置,而不仅仅是配置.因此,如果我覆盖模型表单或视图中的方法,我将测试它.这听起来像是一个好方法,还是我真的要测试上面提到的每一件小事?

最佳答案 我建议你从功能测试开始.它们用于从下到上测试整个堆栈.例如,您有模型,表单和创建视图.因此,您可以进行一项测试,确保用户可以打开创建表单,并提交该表单将导致创建对象.就像用户一样:

class CreationTestCase(TestCase):
    def test_creation_page_get(self):
        url = reverse('your_model_create')
        response = self.client.get(url)

        # Your page gave 200, so there are no severe configuration errors
        self.assertEqual(response.status_code, 200)
        self.assertTemplateUsed(response, 'your/template.html')
        # The template context contains your form, so most probably you view did fine.
        self.assertEqual(type(response.context['form']), YourForm)

    def test_creation_page_post(self):      
        payload = {'field1': 1, 'field2': 2}
        response = self.client.post(reverse('your_model_create'), payload)

        # Your page redirected to a success url, so the view did ok.
        self.assertRedirects(response, reverse('your-success-url'))
        # The instance is actually created and contains the right data
        instance = YourModel.objects.first()
        self.assertEqual(instance.field1, payload['field1'])

在这里,我们通过模拟用户行为来测试您的urlconf,视图,表单和模型.此外,您可以自由更改基础视图和表单,保持相同的用户工作流程.

功能测试的最大缺点是速度.在测试整个应用程序时,您的测试用例可能会花费很多时间.

我个人倾向于在我看到要重构的代码中的逻辑块时编写单元测试,或者它似乎值得测试.

换句话说,测试行为,而不是配置.

点赞