前言:之前有一段時間一直用 Python Uittest做自動化測試,覺得Uittest組織冒煙用例比較繁瑣,後來康哥提示我使用pytest.mark來組織冒煙用例
本文講述以下幾個內容:
1、Unittest 如何組織冒煙用例
2、Pytest 組織冒煙測試
3、Pytest 執行unittest冒煙用例
環境準備:
Python 3.64
Pytest 5.01
專案目錄:
smoke_testing_demo
test_case
__init__.py
test_case_with_unittest.py
test_case_with_pytest.py
run_unittest_smoke_testing.py
一、Unittest如何組織冒煙用例
- 當 import unittest 時 ,會自動匯入TestLoader類
- TestLoader這個類下,封裝了 5 種組織用例的方法
- 本文主要講解 loadTestsFromNames
- 更多Uittest組織用例方法可參考《Unittest組織用例的姿勢》這篇博文,連結在文末
loadTestsFromNames 方法簡介
$ loader.py 該檔案在python3.7已不存在,建議使用python3.64 檢視使用方法
class TestLoader(object):
"""
該類負責根據各種標準載入測試並將它們包裝在TestSuite中
"""
def loadTestsFromNames(self, names, module=None):
"""
返回給定的一組用例名的測試用例的套件
"""
loadTestsFromNames 組織冒煙用例
測試用例
$ test_case_with_unittest.py
#!/usr/bin/env python3
# encoding:utf-8
import unittest
class TestUittestCase(unittest.TestCase):
def test_case_with_unittest_1(self):
'''冒煙測試用例'''
print('I am Smoke Testing ')
def test_case_with_unittest_2(self):
pass
if __name__ == '__main__':
unittest.main(verbosity=2)
$ test_case_with_unittest2.py
#!/usr/bin/env python3
# encoding:utf-8
import unittest
class TestUittestCase2(unittest.TestCase):
def test_case_with_unittest_3(self):
'''冒煙測試用例'''
print('I am Smoke Testing ')
def test_case_with_unittest_4(self):
pass
if __name__ == '__main__':
unittest.main(verbosity=2)
冒煙測試用例集
$ run_unittest_smoke_testing.py
#!/usr/bin/env python3
# encoding:utf-8
import unittest
cases = [
'test_case.test_case_with_unittest2.TestUittestCase2.test_case_with_unittest_3',
'test_case.test_case_with_unittest.TestUittestCase.test_case_with_unittest_1'
]
test_suit = unittest.TestLoader().loadTestsFromNames(cases)
runner = unittest.TextTestRunner(verbosity=2)
runner.run(test_suit)
執行結果
test_case_with_unittest_3 (test_case.test_case_with_unittest2.TestUittestCase2)
冒煙測試 ... ok
test_case_with_unittest_1 (test_case.test_case_with_unittest.TestUittestCase)
冒煙測試 ... ok
----------------------------------------------------------------------
Ran 2 tests in 0.000s
小結:
- 通過loadTestsFromNames 可以從不同的模組組織特定的用例集
- 使用loadTestsFromNames這個方法,需要傳入一個陣列
- 陣列裡面裡面的元素必須是字串
- 陣列元素傳入格式:'moudleName.testCaseClassName.testCaseName'
- 執行用例是根據陣列元素的的順序執行
ps: 更多通過loadTestsFromNames 使用技巧,
可以檢視《Unittest組織用例的姿勢》這篇博文,連結在文末
二、Pytest 組織冒煙測試
- pytest 提供了測試用例標記機制
- 一個測試用例允許被多個@pytest.mark進行標記
- 同一個@pytest.mark可以標記多個測試用例
- pytest.mark常用於冒煙測試用例組織
ps:更多的pytest.mark用法可以參考乙醇老師《安利一下pytest的mark用法》
pytest.mark 組織冒煙用例
測試用例
$ run_unittest_smoke_testing.py
#!/usr/bin/env python3
# encoding:utf-8
import pytest
@pytest.mark.test_env
def test_case_1():
pass
@pytest.mark.test_env
@pytest.mark.smoke
def test_case_2():
''' 冒煙用例'''
pass
cd 進入 /test_case目錄,
使用命令列執行 test_case_with_pytest.py
pytest test_case_with_pytest.py -v -m smoke
執行結果
collected 2 items
test_case_with_pytest.py::test_case_2 PASSED
============================== 1 tests deselected ==============================
==================== 1 passed, 1 deselected in 0.01 seconds ====================
執行被標記test_env的用例
pytest test_case_with_pytest.py -v -m test_env
執行結果
collected 2 items
test_case_with_pytest.py::test_case_1 PASSED
test_case_with_pytest.py::test_case_2 PASSED
=========================== 2 passed in 0.01 seconds ===========================
三、Pytest 執行 Unittest冒煙用例
Pytest測試框架是相容Python自帶的Unittest
修改test_case_with_unittest2.py
$ test_case_with_unittest2.py
#!/usr/bin/env python3
# encoding:utf-8
import unittest
import pytest
class TestUittestCase2(unittest.TestCase):
@pytest.mark.smoke
def test_case_with_unittest_3(self):
'''冒煙測試用例'''
print('I am Smoke Testing ')
def test_case_with_unittest_4(self):
pass
if __name__ == '__main__':
unittest.main(verbosity=2)
命令列執行 test_case_with_unittest2.py
pytest test_case_with_unittest2.py -v -m smoke
執行結果
collected 2 items / 1 deselected / 1 selected
test_case_with_unittest2.py::TestUittestCase2::test_case_with_unittest_3 PASSED [100%]
============== 1 passed, 1 deselected, 1 warnings in 0.01 seconds ==============
總結:
1、Uittest組織冒煙用例,需通過loadTestsFromNames在不同的測試模組裡指定測試用例,組裝成test suit(測試套件)後,給TextTestRunner執行
2、Pytest組織冒煙用例,只需給測試用例加上@pytest.mark.key ,使用命令列pytest -m key test_case.py 即可
自動化冒煙測試 Unittest , Pytest 哪家強?
筆者個人見解:
使用Uittest組織冒煙測試,關注點有至少有兩個
1、當編寫新功能的冒煙測試,需要去維護冒煙測試用例集
2、合併程式碼時,如果有兩個人同時修改了這個冒煙用例集,還要解決衝突,防止遺漏冒煙用例使用Pytest組織冒煙測試,關注點在於用例的本身
當編寫新功能的冒煙測試,我只需在給用例加一個編寫用例人員約定好的@pytest.mark,例如@pytest.mark.smoke
推薦閱讀:
《Python Unittest - 根據不同測試環境跳過用例詳解》
原始碼地址:
https://github.com/SEtester/smoke_testing_demo
最後,歡迎同學們留言, 你認為自動化冒煙測試 Unittest , Pytest 哪家強?
文章如有不是,歡迎同學們斧正