Python內(nèi)部自帶了一個單元測試的模塊——pyUnit,也就是我們說的:unittest
先介紹一下unittest的基本使用方法
1. import unittest模塊
2. 定義一個繼承 unittest.TestCase 的測試用例類
3. 定義 setUp 和 tearDown兩個方法,tearDown的過程很重要,是為以后的TestCase留一個干凈的測試環(huán)境。
4. 定義測試用例,均要以test開頭
5. 一個測試用例只需要測試一個方面,測試的目的和測試內(nèi)容要很明確。一般使用assertEqual、assertIn等斷言方法去判斷程序執(zhí)行的結(jié)果和預(yù)期結(jié)果是否相符
6. 調(diào)用 unittest.main() 開始跑測試用例
7. 測試全部通過,不輸出任何東西;若測試未通過,則會輸出相應(yīng)的錯誤提示。
unittest執(zhí)行順序
在pycharm里執(zhí)行腳本的時候,發(fā)現(xiàn)了一個問題。本來在執(zhí)行的時候,我還加了幾步往config文件里寫登錄信息的步驟,但是在執(zhí)行完成之后我發(fā)現(xiàn),config文件里根本沒有我想要寫入的信息。然后我就加了一些打印信息,發(fā)現(xiàn)在執(zhí)行這個腳本的時候,紅框里的方法根本沒有執(zhí)行。后來查了一下,找到了原因,是pycharm里執(zhí)行方式選擇導(dǎo)致的。
主程序中先加載哪個方法,或者后加載哪個方法,在unittests運行的模式下,沒有任何作用。在該模式運行下,主程序先執(zhí)行哪個類,是按照這個類的名字字母以及數(shù)據(jù)排序的;先運行哪個方法,是按照某類中,方法的名字、數(shù)字排序的。
而在普通模式下,就是按照寫的執(zhí)行順序運行的。而unittest.main()方法會自動把所有的測試類加到測試集里,然后再加載到runner中去執(zhí)行。
下面是unittest中常用的assert語句
assertEqual(a,b,[msg='測試失敗時打印的信息']):若 a=b,則測試用例通過
assertNotEqual(a,b,[msg='測試失敗時打印的信息']):若a != b,則測試用例通過
assertTrue(x,[msg='測試失敗時打印的信息']):若x是True,則測試用例通過
assertFalse(x,[msg='測試失敗時打印的信息']):若x是False,則測試用例通過
assertIs(a,b,[msg='測試失敗時打印的信息']):若a是b,則測試用例通過
assertNotIs(a,b,[msg='測試失敗時打印的信息']):若a不是b,則測試用例通過
assertIsNone(x,[msg='測試失敗時打印的信息']):若x是None,則測試用例通過
assertIsNotNone(x,[msg='測試失敗時打印的信息']):若x不是None,則測試用例通過
assertIn(a,b,[msg='測試失敗時打印的信息']):若a在b中,則測試用例通過
assertNotIn(a,b,[msg='測試失敗時打印的信息']):若a不在b中,則測試用例通過
assertIsInstance(a,b,[msg='測試失敗時打印的信息']):若a是b的一個實例,則測試用例通過
assertNotIsInstance(a,b,[msg='測試失敗時打印的信息']):若a不是b的實例,則測試用例通過
assertAlmostEqual(a, b):round(a-b, 7) == 0
assertNotAlmostEqual(a, b):round(a-b, 7) != 0
assertGreater(a, b):a > b ? ??
assertGreaterEqual(a, b):a >= b ? ??
assertLess(a, b):a < b ? ??
assertLessEqual(a, b):a <= b ? ??
assertRegexpMatches(s, re):regex.search(s) ? ??
assertNotRegexpMatches(s, re):not regex.search(s) ? ??
assertItemsEqual(a, b):sorted(a) == sorted(b) and works with unhashable objs ? ??
assertDictContainsSubset(a, b):all the key/value pairs in a exist in b ? ??
assertMultiLineEqual(a, b):strings ? ??
assertSequenceEqual(a, b):sequences ? ??
assertListEqual(a, b):lists ? ??
assertTupleEqual(a, b):tuples ? ??
assertSetEqual(a, b):sets or frozensets ? ??
assertDictEqual(a, b):dicts ? ??