2009-01-21 124 views
28

除了在Uni课程中快速介绍之外,我还没有使用单元测试。我目前正在编写一个应用程序,并希望在此过程中教导我自己的TDD。问题是,我不知道要测试什么或者真的如何。在Django/Python中编写单元测试

我正在编写一个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应用程序需要什么?一些例子会很好。

+0

一个TestCase的我可以无耻地宣传我的教程来测试Django的应用程序,这不仅包括单元测试,也正确的浏览器行为利用强大的硒测试:测试驱动的Django教程](HTTP://哈利.pythonanywhere.com /) – hwjp 2011-11-24 19:54:50

回答

36

是测试ModelTests类中的每个模型编写测试的好方法的功能?

究竟应该对我进行测试?

  • 创建所有字段的模型完成的作品?

  • 半完整模型失败?

  • 也就是说任何特殊情况下进行测试(如零和is_required = FALSE)?

  • 我已经在ORM,其中据我所知是经过大量测试的信任,所以我不应该需要测试所有的方法要这样呢?

没有太多的。

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

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

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

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

后来,当你在你的应用程序有更多的东西(表单,视图,网址等),你需要使用Django的单元测试客户端行使每个URL的每个方法。同样,每

+2

一旦我写出了骨架,并为一个模型定义了两个测试,我意识到我浪费了我的时间。没有什么可以测试的,我不确定。尽管如此,我还没有定义自定义方法。非常好的答案我很感激。 – 2009-01-22 11:46:09

9

我不完全确定你想要测试的细节,我需要更多的代码片段,但我可以给你一些一般性的建议。

首先,阅读“潜入Python”(免费在线!http://diveintopython3.ep.io/unit-testing.html)的单元测试章节,这是一般单元测试的一个很好的解释,你需要做什么以及为什么。其次,关于TDD,这是一种有价值的做法,但要小心过度依赖它,因为我发现它可能会导致过度指定软件,并进一步导致软件无法被重新使用 - 开发并适应新的任务。这只是我的经验,介意。另外,提供你不用教条式TDD是有价值的。第三,它告诉我,针对您的具体情况的最佳建议是努力测试您的逻辑,而不是您依赖于的框架的逻辑。这意味着经常测试半完整模型失败等等可能不合适,因为那不是你的逻辑,而是django的,所以应该已经被测试过了。更有价值的是测试一些预期的情况,你期望的实例化,你期望的异常等,以确保你的模型规范是正确的,然后继续你的应用程序的更实质的逻辑。

+1

+1了解如何真正开始使用Python进行单元测试以及与TDD分享您自己的体验。 – 2009-07-16 10:58:44

4

想必您已经阅读测试Django Applications

开始测试您的应用程序的正常使用情况下,创建一个新用户,增加了博客条目,等等只是典型的CRUD操作,然后再移动到边缘的情况。基本上,您在应用程序中建立对后来改变的任何事情的信心不会破坏我期望应用程序行为的方式。

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

它通常是值得投入的跟踪系统(例如Trac的),所以你可以添加一个新的测试为每个登录的缺陷。