前言
目前有兩種純測試的測試框架,pytest和unittest,這系列文章主要介紹pytest為主
UnitTest測試框架理論
- python 自帶的單元測試框架,常用在單元測試
- 在自動化測試中提供用例組織與執行
- 提供豐富的斷言方法-驗證函數等功能
- 加上HTMLTestRunner可以生成html報告
- 官方文檔 https://docs.python.org/3/library/unittest.html
官方簡單的例子
import unittest
class TestStringMethods(unittest.TestCase):
# setUp代表執行函數測試前要做什么,每個函數前后都會執行一次
def setUp(self) -> None: # -> 表示返回了什么結果
print("setup")
# tearDown代表執行函數測試后要做什么
def tearDown(self) -> None:
print("teardown")
@classmethod # 下面兩個實例,代表整個測試類的開始(setUpClass)前的操作和結束(tearDownClass)后的操作 只執行一次
def setUpClass(cls) -> None:
print('setUpclass---->')
@classmethod
def tearDownClass(cls) -> None:
print('tearDownClass---->')
def test_abd(self):
print('test_adb')
def test_upper(self):
print('test_upper')
self.assertEqual('foo'.upper(), 'FOO')
def test_isupper(self):
print('test_isupper')
self.assertTrue('FOO'.isupper())
self.assertFalse('Foo'.isupper())
def test_split(self):
s = 'hello world'
print("test_split")
self.assertEqual(s.split(), ['hello', 'world'])
# check that s.split fails when the separator is not a string
with self.assertRaises(TypeError):
s.split(2)
if __name__ == '__main__':
unittest.main()
說明:
- Unittest 提供了 test cases、 test suites、 test fixtures、 test runner等相關組件
- 編寫規范
- 測試模塊首先 import unittest
- 測試類必須繼承 unittest.TestCase
- 測試方法必須以"test_"開頭
實戰:
測試一個search的類
import unittest
# 測試一個search的類
class Search:
def serch_fun(self):
print("search....")
return True
class TestSearch(unittest.TestCase):
@classmethod
def setUpClass(cls) -> None:
cls.search = Search()
print('setUpclass---->')
@classmethod
def tearDownClass(cls) -> None:
print('tearDownClass---->')
def test_search(self):
print('test_search111...')
assert True == self.search.serch_fun()
def test_searc2(self):
print('test_search222...')
assert True == self.search.serch_fun()
def test_searc3(self):
print('test_search333...')
assert True == self.search.serch_fun()
if __name__ == '__main__':
unittest.main()
Pytest簡單介紹
非常容易上手,入門簡單,文檔豐富,文檔中有很多實例可以參考
能夠支持簡單的單元測試和復雜的功能測試
支持參數化
執行測試過程中可以將某些測試跳過(skip),或者對某些預期失敗的case標記成失敗
支持重復執行(rerun)失敗的 case
支持運行由 nose, unittest 編寫的測試 case
可生成 html 報告
方便的和持續集成工具 jenkins 集成
可支持執行部分用例
具有很多第三方插件,並且可以自定義擴展
Pytest安裝
在Python的虛擬環境pip中直接輸入
pip install pytest
創建一個簡單的Demo, 文件名字為: test_demp.py
def func(x):
return x + 1
def test_answer():
assert func(3) == 5
class TestClass:
def test_a(self):
print('1')
def test_b(self):
print('2')
注意:
- 執行 pytest 時候 會查找當前目錄及其子目錄下以 test_*.py 或 *_test.py 文件,找到文件后,在文件中找到以 test 開頭函數並執行
- 執行一個文件的時候就 pytest + 指定文件.py
- Test類包含的所有test_的方法(測試類不能有__init__.py)
或者可以選擇用Python的解釋器執行, 在test_demo.py文件底下加上入口
if __name__ == '__main__':
pytest.main(['test_demo.py'])
Pytest執行用例規則
1、運行test_demo.py 模塊里面的某個函數,或者某個類,某個類里面的方法
加v和不加-v都可以,加-v的話,打印的信息更詳細
pytest -v test_demo.py::TestClass::test_one
pytest test_demo.py::TestClass::test_one
pytest test_demo.py::test_answer
2、執行某個 匹配用例名稱 -k
pytest -k test_a -v
3、-k 同時匹配不同的用例名稱, 符合 test_a* 或者 test_b* 的函數都會進行測試
pytest -k "test_a or test_b" -v
4、 (常用)參數化的方式生成多個測試用例, 在test_demo.py中更改代碼 改為
@pytest.mark.parametrize('a,b', [(1, 2), (2, 3)])
def test_answer(a, b):
assert func(a) == b
然后在控制台中執行: pytest -k test_answer -v
5、遇到需要在測試用例前進行的操作,比如登錄,則需要在函數前加入裝飾器fixture
# 同樣改寫的是test_demo.py, 在最外層寫個函數
@pytest.fixture()
def login():
print('登錄之后')
username = 'od'
return username
然后在 TestClass 中調用
class TestClass:
def test_a(self, login):
print(f'login name is {login}')
print('1')
def test_b(self):
print('2')
def test_c(self, login):
print(f'login name is {login}')
print('3')
#然后執行
pytest -v -s
#-s 可以在控制台輸出print的內容
這樣就可以執行裝飾器修飾的所有測試, 下一節學的是參數驅動的一些筆記
