Django中的单元测试:TestCase类与方法的关系是什么

1 投票
2 回答
1532 浏览
提问于 2025-04-15 21:15

我正在Django中做一些单元测试的工作。请问TestCase类和这个类里的实际方法之间是什么关系?组织这些内容的最佳实践是什么?

举个例子,我有

class Test(TestCase):
    def __init__(self):
        ...
    def testTestA(self):
        #test code

    def testTestB(self):
        #test code

如果我这样组织:

class Test1(TestCase):
    def __init__(self):
        ...
    def testTestA(self):
        #test code

class Test2(TestCase):
    def __init__(self):
        ...
    def testTestB(self):
        ...

哪种方式更好,二者有什么区别?

谢谢!

2 个回答

1

关于如何合理组织案例A和B,以及测试方法1、2和3,这个问题有点难回答。

不过,把测试分开成不同的测试案例有两个主要的好处:

1) 可以把测试按照一些逻辑分组,比如CustomerViewTests(客户视图测试)、OrdersAggregationTests(订单聚合测试)等等。

2) 对于那些需要相同准备和清理步骤的测试,可以共享同样的setUp()和tearDown()方法。

想了解更多信息和例子,可以查看unitTest文档

8
  1. 你很少会为一个 TestCase__init__ 方法。所以可以把这个从你对单元测试的理解中去掉。

  2. 你有时会写 setUptearDown 方法。不过,Django 自动化了很多这些工作,通常你只需要提供一个静态的 fixtures= 变量,用来填充测试数据库。

那么,什么是测试用例呢?

测试用例就是一个“固定装置”——也就是你要测试的单元的配置——你可以对其进行操作。理想情况下,每个 TestCase 都有一个 setUp 方法,用来创建一个固定装置。每个方法会对这个固定装置进行操作,并检查这个操作是否成功。

不过,这并不是绝对的。

在很多情况下,特别是在使用 Django 模型时,可能并没有那么多有趣的操作。

如果你没有在模型中重写 save 方法,其实你不需要做 CRUD 测试。你可以(而且应该)信任 ORM。如果你不信任它,那就换一个你信任的框架。

如果你的模型类里有几个属性,你可能不想为每个属性都创建一个单独的方法来测试。你可以选择在一个 TestCase 的单个方法中依次测试它们。

另一方面,如果你有一个非常复杂的类,状态变化很多,那么你就需要一个独立的 TestCase 来配置对象的某个状态,改变它到另一个状态,并检查这些变化是否都正常。

视图函数因为技术上不是有状态的,所以不完全符合单元测试的理念。在做 setUp 来创建一个已知状态的单元时,你是通过客户端接口进行一些交互,以创建一个已知状态的会话。一旦会话达到你想要的状态,你的各种测试方法就会对这个会话进行操作,并检查结果是否正确。

总结

把 TestCase 看作是一个“设置”或“上下文”,在这个环境中进行测试。

把每个方法看作是“当_X_时_Y_应该发生”的陈述。有些人建议用这种方式命名(“test_when_x_should_y”),这样方法就会执行“X”,并检查“Y”是否是响应。

撰写回答