在TestCase类中,setUpClass、setUpTestData和setUp有什么区别?

41

更具体地说,每一种方法的使用场景是什么?

到目前为止我所理解的:

setUpClass

  • 这个方法在一个测试类中的所有测试之前运行一次。

setUpTestData

  • 如果数据库支持事务,则此方法只运行一次。否则,在每个测试之前都会运行。

setUp

  • 这个方法在测试类中的每个测试之前都会运行。

根据我上面提到的理解,setUpTestData似乎处于setUpClass和setUp之间的位置。既然可以通过setUpClass或setUp或两者的组合来实现相同的效果,为什么我们需要一个类级别的setUpTestData方法呢?

1个回答

44

编辑:在Alasdair的评论后进行更新/更正

setUpClass

  • setUpClass 用于执行类级别的初始化/配置(例如创建连接、加载Web驱动程序)。例如,当使用 setUpClass 打开数据库连接/会话时,您可以使用 tearDownClass 关闭它们。
  • setUpClass 在运行任何测试之前,仅对 TestCase 调用一次。同样地,tearDownClass 在运行所有测试后调用。

来自文档的注释:

SimpleTestCase 及其子类(例如 TestCase,...)依赖于 setUpClass() 和 tearDownClass() 来执行一些类级别的初始化工作(例如覆盖设置)。如果您需要覆盖这些方法,请不要忘记调用 super 实现:

setUpTestData

  • setUpTestData 用于为每个测试用例创建初始测试数据。此方法由 TestCase.setUpClass() 调用 (src)
  • documentation 所述,setUpTestData 仅在 TestCase 中被调用一次。如果数据库不支持事务,则 setUpTestData 将在每次测试运行之前被调用(感谢 @Alasdair 更正)

setUp

  • setUp 将在每次测试运行之前被调用,并应该用于为每个测试运行准备测试数据集。

使用 setUpTestData 可以提高测试性能,但请注意,在测试中更改此数据将在不同的测试运行之间保持。如果需要重新加载它,可以从 setUp 方法中完成。 如果用于运行测试的数据库不支持事务,则性能提升将被抵消(因为 setUpTestData 将在每次测试运行之前被调用)


3
不完全正确。如果数据库支持事务,setUpTestData方法只会被调用一次。仅当数据库不支持事务时,在每次测试之前才会调用它。 - Alasdair
1
感谢您的回答@Mil4n。 SetupTestData似乎与setUp方法具有类似的用例。或者正如Alasdair所提到的,区别在于DB中的事务支持。我的理解正确吗? - Raiyan
1
Raiyan - 我改正了!setUpData只会被调用一次,用于为测试用例加载初始数据(或者如@Alasdair所述),但是setUp将在每个测试之前被调用。我会更新我的答案。 - Milan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接