1.(続き)ユニットテストを認識します
unittestのユニットテストフレームワークについて、さらなる調査に値するいくつかの問題があります。あなたは、このセクションで答えを見つけるかもしれませんが、前の章で学習過程でいくつかの疑問を持っていることがあります。
実行シーケンスは、実施例1.1
ユースケースの実行順序を実行するためにどのディレクトリ、複数のテストディレクトリの場合には、複数のレベルを必要としますか?複数のテストファイルの場合は、そのファイルを実行するには?複数のテストクラスの場合は、そのテストファーストクラスを実行するには?複数試験法(ユースケース)の場合、及びその試験方法で実行しますか?
レッツは再び政策unittestモジュールの実装を説明し、例を実行します。
輸入unittestの クラスTestBdd(たunittest.TestCase): デフセットアップ(自己): 印刷(" テストTestBdd:" ) DEF test_ccc(自己): プリント(" テストCCC " ) デフtest_aaa(自己): プリント(" テストAAA " ) DEF :ティアダウン(自己) パス クラスTestAdd(たunittest.TestCase): デフセットアップ(自己): 印刷(" テストTestAdd:" ) デフtest_bbb(自己): プリント(" テストBBB " ) デフティアダウン(自己): パス の場合 __name__ == ' __main__ ' : unittest.main()
結果:
何度も実行が、結果は同じであるか、上記の結果は、私はあなたを信じてどんなには、テストケースの実行unittestの法則を発見しました。
0-9、AZ、AZ:unittestのテストフレームは、数字と文字の順序として、ASCIIコードの順序に従って、デフォルトでロードされます。それは実施例で上から下への順序で実行されていないので、したがって、testAdd優先度クラスをTestBddに基づいて行われる、test_aaa()メソッドが実行され()test_cccに限定されます。
以下のためのテストディレクトリとテストファイルの場合は、ユニットテストフレームワークは、負荷テストケースにこのルールに従ってもあります。
だから、()、それを強制するためにtest_cccさせることができますか?答えはイエスですが、デフォルトのmain()メソッドを使用することができないのではなく、特定の順序でロードするためにaddTest TestSuiteのクラス()に必要です。
輸入unittestの クラスTestBdd(たunittest.TestCase): デフセットアップ(自己): 印刷(" テストTestBdd:" ) DEF test_ccc(自己): プリント(" テストCCC " ) デフtest_aaa(自己): プリント(" テストAAA " ) DEF :ティアダウン(自己) パス クラスTestAdd(たunittest.TestCase): デフセットアップ(自己): 印刷(" テストTestAdd:" ) デフtest_bbb(自己): プリント(" 試験BBB " ) DEF ティアダウン(自己): 合格 なら __name__ == ' __main__ ' : #构造测试集 スイート= unittest.TestSuiteインスタンス() suite.addTest(TestBdd(" test_ccc " )) スイート.addTest(TestAdd(" test_bbb " )) suite.addTest(TestBdd(" test_aaa " )) #执行测试 ランナー= unittest.TextTestRunner() runner.run(スイート)
結果:
今すぐ実行順序は、順序addTest()メソッドがロードされています。ディスカバー()同様に、メインと負荷試験規則()。そこで、我々は名前だけが実行するテストケースの優先順位を上げることができます。たとえば、あなたが「test_a」という名前の実行される最初のテストケースになるでしょう、テストケースの最後の希望は「test_z」という名前の実行しました。
1.2実施例は、マルチレベルのディレクトリで実行しました
我々は、Webユースケースの数を制御する必要がありますが、順序は、特定のテストケースに到達したとき、私たちは、ディレクトリを分割を検討してください。
test_project / test_case /
test_bbb /
test_ccc /
test_c.py
test_b.py
test_ddd /
test_d.py
test_a.py
パラメータが定義されている場合は、上記のディレクトリ構造については、start_dirは()メソッドは「./test_case/」ディレクトリを発見し、あなただけのtest_a.pyファイルのテストケースを読み込むことができます。どのようにtest_case /サブディレクトリハイエンド・テスト・ドキュメントへのユニットテストフレームワークのルックスを作るには?この方法は、(フォルダ内の__init __が含まれている。Pyと、Pythonは輸入が外にすることができPYファイル内に、パッケージとしてフォルダを入れます)各サブディレクトリに__init__.pyファイルを配置するために、非常に簡単です。
1.3テストをスキップして失敗することが期待されています
あなたがテストを実行し、時にはテストケースの一部をスキップする、または患者が条件と会ったときにテストをスキップする必要がある場合、または直接テストケースに失敗します。unittestのは、これらの要件デコレータの実装を提供します。
(理由)unittest.skip:無条件は変更テストをスキップし、テストをスキップ理由です。
unittest.skipIf(条件、理由):条件が真である場合、修飾テストをスキップします。
unittest.skipUnless(条件、理由):条件が真でない限りスキップは、試験修飾しました。
unittest.expectedFailure():失敗したとしてテストがマークされています。失敗したように関係なくのは失敗の結果かどうか、統一マーク。
インポートunittestの クラス(たunittest.TestCaseの)のMyTest: DEF セットアップ(セルフ): パス DEF ティアダウン(自己): パス unittest.skip @(" テストをスキップ" ) DEF (自己を)test_skip: 印刷(' テストAAA ' ) @ unittest.skipIf( 3> 2、。" スキップ条件がTrueテストです" ) DEFのtest_skip_if(セルフ): 印刷(' テストBBB ' ) unittest.skipUnless @( 3> 2は、"実行条件が真のテストのとき」) DEFのtest_skip_unless(セルフ): 印刷(' テストCCC ' ) unittest.expectedFailure @ DEFのtest_expected_failure(セルフ): assertEqual( 2,3 ) IF __name__ == ' __main__ ' : unittest.main( )
結果:
例CCPは、4つのテストケースを作成しました。@ unittest.skip()修飾されたスキップによる最初のテストは行われません。実行条件が真でないときに、第2の実施形態を使用して@ unittest.skipIf()修飾、3> 2の条件は、行わないことで、真(TRUE)です。実行されたときに第三の条件が真である、3> 2条件(TRUE)真であると判断し、第三のユースケースは、いつ、@ unittest.skipUnless装飾によって行います。かかわらず、実行に失敗した結果かどうかのunittest.expectedFailure装飾的なユースケース@の記事、まとめて失敗としてラベルが、エラーメッセージをスローしません。
もちろん、これらの方法は、単にカテゴリー上記のテストでそれらを定義することができ、テストクラスに適用することができます。
import unittest @unittest.skip("直接跳过测试该测试类") class MyTest(unittest.TestCase):
1.4 fixtures
fixtures的概念前面已经有过简单的介绍,可以形象的把它看作是夹心饼干外层的两片饼干,这两片饼干就是setUp/tearDown,中间的心就是测试用例。除此之外,unittest还提供了更大范围的fixtures,例如对于测试类和模块的fixtures。
import unittest def setUpModule(): print("test module start >>>>>>>>>>>>>>>>") def tearDownModule(): print("test module end >>>>>>>>>>>>>>>>") class Test(unittest.TestCase): @classmethod def setUpClass(cls): print("test class start ==============>") @classmethod def setDownClass(cls): print("test class end ==============>") def setUp(self): print("test case start -->") def tearDown(self): print("test case end -->") def test_case(self): print("test case1") def test_case2(self): print("test case2") if __name__ == '__main__': unittest.main()
运行结果:
setUpModule/tearDownModule:在整个模块的开始与结束时被执行。
setUpClass/tearDownClass:在测试类的开始与结束时被执行。
setUp/tearDown:在测试用例的开始与结束时被执行。
需要注意的是, setUpClass/tearDownClass的写法稍微有些不同。首先,需要通过@classmethon进行修饰,其次方法的参数为cls。其实,cls与self并没有什么特别之处,都只表示类方法的第一个参数,只是大家约定俗成,习惯于这样来命名,当然也可以用abc来代替。