在Django / Python中编写单元测试

时间:2009-01-21 12:22:25

标签: python django unit-testing

除了在Uni课程中快速介绍之外,我之前没有使用过单元测试。我现在正在编写一个应用程序,并希望在此过程中自学TDD。问题是,我不知道测试什么或真正如何。

我正在编写一个Django应用程序,到目前为止只创建了模型(并自定义了管理应用程序)。这就是我到目前为止编写测试的骨架的方法:

class ModelTests(TestCase):
    fixtures = ['initial_data.json',]

    def setUp(self):
        pass

    def testSSA(self):
        ssa = SSA.objects.create(name="sdfsdf", cost_center=1111, street_num=8,
                street_name="dfsdfsf Street", suburb="sdfsdfsdf",
                post_code=3333)


    def testResident(self):
        pass

    def testSSA_Client(self):
        pass

我计划编写一个函数来测试ModelTests类中的每个模型。这是编写测试的好方法吗?另外,我到底应该测试什么?创建一个完成所有领域的模型?那个半完整的模型失败了吗?测试任何特殊情况(如null和is_required = False)?我相信ORM,据我所知,它经过严格测试,所以我不应该测试所有的方法吗?

我需要测试用Django / Python编写的Web应用程序?一些例子会很好。

3 个答案:

答案 0 :(得分:37)

在ModelTests类中测试每个模型的函数是编写测试的好方法吗?

没有

我到底应该测试什么?

  • 创建完成所有字段的模型有效吗?

  • 那半完整的模型失败了吗?

  • 是否测试过任何特殊情况(如null和is_required = False)?

  • 我相信ORM,据我所知,它经过严格测试,所以我不需要测试所有方法吗?

不多。

您可以测试验证规则,但在您定义了一些Form对象之前,这没有意义。然后你需要测试一下 - 表单是否强制执行所有规则。每个表单至少需要一个TestCase类。函数将是一种场景 - 允许或不允许的不同输入组合。

对于每个Model类,您至少需要一个TestCase类定义。 TestCases很便宜,定义了很多。

您的模型体现了您的“业务实体”定义。您的模型将具有实现业务规则的方法。你的方法会做诸如汇总,过滤,计算,聚合,减少等各种事情。您将拥有模型类的每个功能的功能。

你没有测试Django。您正在测试您的业务规则在Django中的实际工作方式。

稍后,当您的应用程序中有更多内容(表单,视图,URL等)时,您将需要使用Django unittest客户端为每个URL执行每种方法。同样,每个

一个TestCase

答案 1 :(得分:10)

我不确定你在这里尝试测试的具体细节,我需要更多的代码片段,但我可以给你一些一般的建议。

首先,阅读“潜入Python”的单元测试章节(它是免费在线的!http://diveintopython3.ep.io/unit-testing.html),这是对一般单元测试,你需要做什么以及为什么做的一个很好的解释。

其次,关于TDD,这是一种有价值的做法,但要小心增长过于依赖它,因为我发现它可能导致过度指定软件,并进一步使用无法重新使用的软件开发并适应新任务。这只是我的经历,记住。另外,如果你没有教条地使用它,TDD很有价值。

第三,令我感到震惊的是,针对您的具体情况的最佳建议是努力测试您的逻辑,而不是您依赖的框架的逻辑。这意味着经常测试半完整模型失败等等可能不合适,因为这不是你的逻辑,而是django,所以应该已经进行了测试。更有价值的是测试一些预期的情况,您期望的实例化,您期望的异常等,以确保您的模型规范是合理的,然后转向应用程序的更实质的逻辑。

答案 2 :(得分:4)

据推测,您已经阅读过测试Django Applications

开始测试应用程序的正常用例,创建新用户,添加博客条目等。首先是典型的CRUD操作,然后转到边缘案例。基本上,您对应用程序的建立信心,即您以后更改的任何内容都不会破​​坏我期望应用程序的行为方式。

模拟您网址上的GET / POST请求并观察回复(标题,状态代码和内容)。您的应用程序是否呈现正确的视图?使用正确的模板?在应用程序抛出异常的部分中,尝试触发它们(例如,查看/编辑不存在的记录以引发ObjectDoesNotExist)。

通常值得投入跟踪系统(例如Trac),因此您可以为每个已记录的缺陷添加新测试。