実際のセレン(IV) - unittestのユニットテスト(テストケースの実行順序)3

テストケースの実行順序

  レベル:複数のテストディレクトリ>複数のテストファイル>複数のテストカテゴリ>複数の試験方法(テストケース)。ここでは、テストスクリプトの実行シーケンス例とtest_order.py

1つの インポートunittestの
 2  
3  
4  クラスTestBdd(たunittest.TestCase):
 5  
6      デフセットアップ(自己):
 7          プリント" 試験TestBdd " 8  
9      DEF test_ccc(自己):
 10          プリント" 試験CCC " 11  
12      デフtest_aaa (自己):
 13          プリント" 試験AAA " 14  
15  
16  クラスTestAdd(たunittest.TestCase):
 17  
18     DEF セットアップ(自己):
 19          プリント" 試験TestAdd " 20  
21      DEF test_bbb(自己):
 22          プリント" 試験BBB " 23  
24  
25  なら __name__ == ' __main__ ' 26      unittest.main()

どんなに何回実行、結果は同じです。TestAdd優先度クラスがTestBddに基づいて行われる分岐試験荷重unittestのデフォルト順序ASCIIコード(数字0〜9の文字のシーケンス、A〜Z、A〜Z)ので、ので、test_aaa()メソッドは、優先test_cccを取り()メソッドが実行され、すなわち、それが上から試験の下への順序で実行されていません。

だから、順番に実行順序を指定するには、自分自身を制限命名されていない、負荷テストに特定の順序でaddTest()メソッドにより、テストスイートTestSuitクラスを使用する必要があります。次のように上記のテストを変更すると、次のとおりです。

 1 if __name__ == '__main__':
 2     # 构造测试集
 3     suite = unittest.TestSuite()
 4     suite.addTest(TestBdd("test_aaa"))
 5 
 6     suite.addTest(TestAdd("test_bbb"))
 7     suite.addTest(TestBdd("test_ccc"))
 8 
 9     # 执行测试
10     runner = unittest.TextTestRunner()
11     runner.run(suite)

 执行结果如下:

不过当测试用例非常多时,不推荐用这种方法创建测试套件,最好的办法是通过命名控制执行顺序。如果测试用例在设计时不产生相互依赖,那么测试用例的执行顺序就没那么重复了。

Tips: 如果使用discover()方法要执行某测试文件夹下子目录中的测试文件,可在每个子目录下放一个__init__.py文件(作用是将一个目录标记成一个标准的Python模块)

二、跳过测试和预期失败

  在运行测试时,有时需要直接跳过某些测试用例,或者当测试用例符合某个条件时跳过测试,又或者直接将测试用例设置为失败。unittest提供了实现这些需求的装饰器。

1 unittest.skip(reason)

 无条件地跳过装饰的测试,需要说明跳过测试的原因。

1 unittest.skipIf(condition, reason)

 如果条件为真,则跳过装饰的测试

1 unittest.skipUnless(condition,reason)

 当条件为真时,执行装饰的测试

1 unittest.exceptedFailure()

 不管执行结果是否失败,都将测试标记为失败。下面是测试用例:test_skip.py文件:

 1 import unittest
 2 
 3 
 4 class MyTest(unittest.TestCase):
 5 
 6     @unittest.skip("直接跳过测试")
 7     def test_skip(self):
 8         print("test aaa")
 9 
10     @unittest.skipIf(3 > 2, "当条件为真时跳过测试")
11     def test_skip_if(self):
12         print("test bbb")
13 
14     @unittest.skipUnless(3 > 2, "当条件为真时执行测试")
15     def test_skip_unless(self):
16         print('test ccc')
17 
18     @unittest.expectedFailure
19     def test_expected_failure(self):
20         self.assertEqual(2, 3)
21 
22 
23 if __name__ == '__main__':
24     unittest.main()

执行结果如下:

 当然,这些方法同样适用于测试类,只需将它们针对测试类装饰即可。

1 import unittest
2 
3 @unittest.skip("直接跳过,不测试该类")
4 class MyTest(unittest.TestCase):
5 #……
三、Fixture

  可以将测试套件比作夹心饼干,setUp/tearDown是两片饼干,测试用例是中间的奶油。test_fixture.py文件:

 1 import unittest
 2 
 3 
 4 def setUpModule():
 5     print("test module start >>>>>>>>>>>>>")
 6 
 7 
 8 def tearDownModule():
 9     print("test module end >>>>>>>>>>>>>>>")
10 
11 class MyTest(unittest.TestCase):
12 
13     @classmethod
14     def setUpClass(self):
15         print("test class start ============>")
16 
17     @classmethod
18     def tearDownClass(self):
19         print("test class end ==============>")
20 
21     def setUp(self):
22         print("test case start ------------->")
23 
24     def tearDown(self):
25         print("test case end --------------->")
26 
27     def test_case1(self):
28         print("test case1")
29 
30     def test_case2(self):
31         print("test case2")
32 
33 
34 if __name__ == '__main__':
35     unittest.main()

 需要注意的是,setUpClass/tearDownClass为类方法,需要通过@classmethod进行装饰。另外,方法的参数为cls。其实,cls与self没什么本质区别,都指标是方法的第一个参数。

おすすめ

転載: www.cnblogs.com/pegawayatstudying/p/12196602.html