測試用例代碼:
import unittest
from test_fk_math import TestCrazyitModule
import test_hello
test_cases = "TestHello"
def whole_suite():
# 創建測試加載器
loader = unittest.TestLoader()
# 創建測試包
suite = unittest.TestSuite()
# 從測試類中加載測試用例
tests = loader.loadTestsFromTestCase(test_hello.TestHello)
# 將測試用例添加到測試包中
suite.addTests(tests)
return suite
if __name__ == '__main__':
# 創建測試運行器
runner = unittest.TextTestRunner(verbosity=2)
runner.run(whole_suite())
輸出到文件中:
if __name__ == '__main__':
# 創建測試運行器
'''
runner = unittest.TextTestRunner(verbosity=2)
runner.run(whole_suite())
'''
with open('fk_test_report.txt', 'a') as f:
# 創建測試運行器(TestRunner),將測試報告輸出到文件中
runner = unittest.TextTestRunner(verbosity=2, stream=f)
runner.run(whole_suite())
hello.py
import unittest
from hello import *
class TestHello(unittest.TestCase):
# 測試say_hello函數
def test_say_hello(self):
self.assertEqual(say_hello(), "hello world.")
# 測試add函數
def test_add(self):
self.assertEqual(add(3, 4), 7)
self.assertEqual(add(0, 4), 4)
self.assertEqual(add(-3, 0), -3)
verbosity=1,2對比
運行測試
在編寫完測試用例之後,可以使用如下兩種方式來運行它們。
1.通過代碼調用測試用例。程序可以通過調用unittest.main()來運行當前源文件中
的所有測試用例。例如,在上面的測試用例中增加如下代碼.
if __name__ == '__main__':
unittest.main()
2.使用unittest模塊運行測試用例。使用該模塊的語法格式如下:
python -m unittest 測試文件
如果不指定文件,該命令將自動查找並運行當前目錄下的所有測試用例。因此,程序也可直接使用如下命令來運行所有測試用例
3.result:
測試固件之setUp和tearDown:
重寫setUpClass()和tearDown()類方法
import unittest
from hello import *
class TestHello(unittest.TestCase):
# 測試say_hello函數
def test_say_hello(self):
self.assertEqual(say_hello(), "Hello world.")
# 測試add函數
def test_add(self):
self.assertEqual(add(3, 4), 7)
self.assertEqual(add(0, 4), 4)
self.assertEqual(add(-3, 0), -3)
@classmethod
def setUpClass(cls):
print("\n==========執行setUpClass在類級別模擬初始化測試固件=============")
@classmethod
def tearDownClass(cls):
print("\n==========執行setUpClass在類級別模擬銷燬測試固件=============")
測試結果:
(venv) E:\PythonProject\lesson\venv\com\lxy\crazyPy\16>python -m unittest -v fixture_test2.py
==========執行setUpClass在類級別模擬初始化測試固件=============
test_add (fixture_test2.TestHello) ... ok
test_say_hello (fixture_test2.TestHello) ... ok
==========執行setUpClass在類級別模擬銷燬測試固件=============
----------------------------------------------------------------------
Ran 2 tests in 0.002s
跳過測試
如果希望臨時跳過某個測試用例,則可以通過如下
兩種方式來實現
1.使用skipXxx裝飾器來跳過測試用例。
unittest一共提供了3個裝飾器,分別是@unittest.skip(reason),@unittest.skipif(condition.reason)和@unittest.skipUnless(condition,reason).其中skip代表無條件跳過,skipif代表condition爲True時跳過,skipUnless代表當condition爲False時跳過。
使用TestCase的skipTest()方法來跳過測試用例
方法1——@unittest.skip:
class TestHello(unittest.TestCase):
# 測試say_hello函數
def test_say_hello(self):
self.assertEqual(say_hello(), "Hello world.")
# 測試add函數
@unittest.skip('臨時跳過test_add')
def test_add(self):
self.assertEqual(add(3, 4), 7)
self.assertEqual(add(0, 4), 4)
self.assertEqual(add(-3, 0), -3)
python -m unittest skip_test1.py
(venv) E:\PythonProject\lesson\venv\com\lxy\crazyPy\16>python -m unittest skip_test1.py
sF
======================================================================
FAIL: test_say_hello (skip_test1.TestHello)
----------------------------------------------------------------------
Traceback (most recent call last):
File "E:\PythonProject\lesson\venv\com\lxy\crazyPy\16\skip_test1.py", line 8, in test_say_hello
self.assertEqual(say_hello(), "Hello World.")
AssertionError: 'Hello world.' != 'Hello World.'
- Hello world.
? ^
+ Hello World.
? ^
----------------------------------------------------------------------
Ran 2 tests in 0.001s
FAILED (failures=1, skipped=1)
方法2——TestCase的skipTest():
class TestHello(unittest.TestCase):
# 測試say_hello函數
def test_say_hello(self):
self.assertEqual(say_hello(), "Hello world.")
# 測試add函數
def test_add(self):
self.skipTest("臨時跳過test_add")
self.assertEqual(add(3, 4), 7)
self.assertEqual(add(0, 4), 4)
self.assertEqual(add(-3, 0), -3)
python -m unittest -v skip_test2.py
(venv) E:\PythonProject\lesson\venv\com\lxy\crazyPy\16>python -m unittest -v skip_test2.py
test_add (skip_test2.TestHello) ... skipped '臨時跳過test_add'
test_say_hello (skip_test2.TestHello) ... ok
----------------------------------------------------------------------
Ran 2 tests in 0.001s
OK (skipped=1)
1.PyUnit是python自帶的單元測試框架,用於編寫和運行可重複的測試。PyUnit是xUnit體系的一個成員,xUnit是衆多測試框架的總稱,PyUnit主要用於進行白盒測試和迴歸測試。
2.PyUnit具有如下好處:
2.1可以使測試代碼與產品代碼分離
2.2針對某一個類的測試代碼只需要進行較少的改動,便可以應用於另一個類的測試
2.3PyUnit開放代碼,可以進行二次開發,方便對PyUnit的擴展
3.PyUnit是一個簡單,易用的測試框架,其具有如下特徵:
3.1使用斷言方法判斷期望值和實際值的差異,返回bool值
3.2測試驅動設備可使用共用的初始化變量或實例
3.3測試包結構便於組織和集成運行
4.測試注意事項
4.1測試方法應該沒有返回值
4.2測試方法不應該有任何參數
4.3測試方法應以test_開頭
4.4在測試某個方法時,如果實際測試要求達到某種覆蓋程度,那麼在編寫測試用例時必須傳入多組參數來進行測試,使得測試用例能達到指定的邏輯覆蓋
5.TextTestRunner,它是一個測試運行器,專門用於運行測試用例和測試包。其實前面使用的unittest.main()函數,同樣也是通過
創建TextTestRunner時還指定了verbosity=2,這樣可以生成更詳細的測試信息