程式碼測試用例指南
將測試程式碼和執行程式碼一起寫是一種非常好的習慣。聰明地使用這種方法將會幫助你更加精確地定義程式碼的含義,並且程式碼的耦合性更低。
測試的通用規則:
- 測試單元應該集中於小部分的功能,並且證明它是對的。
- 每個測試單元應該完全獨立。
- 通過Mock去除依賴
- 儘量使測試單元快速執行。
- 實現鉤子來持續整合
我們通過一個簡單的python
程式及unittest
作為示例來為大家介紹如何進行測試,這裡推薦大家使用python3
來執行示例。
我們先建立一個將會使用的測試目錄
mkdir /tmp/TestHookTest
cd /tmp/TestHookTest
測試單元應該集中於小部分的功能,並且證明它是對的
下圖為unittest
包中包含的斷言
我們現在來寫一個通過使用者名稱獲得github資訊的一個函式,並對這個函式進行測試
# test.py
import unittest
import json
import requests
def fetch_github_profile(username):
response = requests.get('https://api.github.com/users/' + username)
return response.json()
class SaveDataTest(unittest.TestCase):
def test_fetch_github_profile(self):
username = 'ZhangBohan'
data = fetch_github_profile('ZhangBohan')
self.assertEqual(data['login'], username)
通過python3 -m unittest test
執行
每個測試單元應該完全獨立
每個都能夠單獨執行,除了呼叫的命令,都需在測試套件中。要想實現這個規則,測試單元應該載入最新的資料集,之後再做一些清理。
如果有資料庫依賴,在每次測試前建立測試資料庫,結束後銷燬該資料庫,測試應該有單獨的資料庫,不要在生產和開發環境測試,避免資料變化引起的測試失敗
通過Mock去除依賴
假設我們現在想把取得的使用者資料儲存到本地,並測試是否正確儲存
# test.py
import unittest
import json
import requests
def fetch_github_profile(username):
response = requests.get('https://api.github.com/users/' + username)
return response.json()
def save_data(data):
with open('data.json', 'w') as f:
f.write(json.dumps(data))
class SaveDataTest(unittest.TestCase):
def test_fetch_github_profile(self):
username = 'ZhangBohan'
data = fetch_github_profile('ZhangBohan')
self.assertEqual(data['login'], username)
def test_save_data(self):
data = fetch_github_profile('ZhangBohan')
save_data(data)
with open('data.json') as f:
file_data = json.loads(f.read())
self.assertIsNotNone(file_data)
self.assertEqual(data['id'], file_data['id'])
在這個測試中我們的test_save_data
中的data
依賴fetch_github_profile
中的返回資料,現實情況中會遇到更為複雜的依賴,為了一個測試用例,我們可能需要構建大量的初始化資料。我們可以通過mock來解除這個依賴,讓test_save_data
專注於測試儲存資料部分
# test.py
import unittest
import json
from unittest.mock import MagicMock
import requests
def fetch_github_profile(username):
response = requests.get('https://api.github.com/users/' + username)
return response.json()
def save_data(data):
with open('data.json', 'w') as f:
f.write(json.dumps(data))
FAKE_PROFILE_DATA = {
"login": "ZhangBohan",
"id": 2317407
}
class SaveDataTest(unittest.TestCase):
def test_fetch_github_profile(self):
username = 'ZhangBohan'
data = fetch_github_profile('ZhangBohan')
self.assertEqual(data['login'], username)
def test_save_data(self):
fetch_github_profile = MagicMock(return_value=FAKE_PROFILE_DATA)
data = fetch_github_profile('ZhangBohan')
save_data(data)
with open('data.json') as f:
file_data = json.loads(f.read())
self.assertIsNotNone(file_data)
self.assertEqual(data['id'], file_data['id'])
儘量使測試單元快速執行
如果一個單獨的測試單元需要較長的時間去執行,開發進度將會延遲,測試單元將不能如期常態性執行。有時候,因為測試單元需要複雜的資料結構,並且當它執行時每次都要載入,所以其執行時間較長。把執行吃力的測試單元放在單獨的測試元件中,並且按照需要執行其它測試單元。
實現hook來持續整合
通過程式碼提交的本地hook或者webhook來持續整合測試你的程式碼。
舉個git本地hook的例子(這可假設你瞭解git hook的工作原理)。
> git init
> vim .git/hooks/pre-commit
在.git/hooks/pre-commit
檔案中寫入
#!/bin/sh
cd /tmp/TestHookTest && python3 -m unittest test
執行:
> chmod +x .git/hooks/pre-commit
> git add test.py
> git commit -m "test hook"
.
----------------------------------------------------------------------
Ran 1 test in 0.000s
OK
[master (root-commit) b390117] test hook
1 file changed, 9 insertions(+)
create mode 100644 test.py
在遠端程式碼倉庫部署的webhook能更好的測試全部程式碼。
相關文章
- 測試用例設計指南
- 測試用例
- 測試面試-測試用例面試
- 測試用例和測試方法
- 測試——水杯的測試用例
- 【5】測試用例
- 測試用例—教室
- 實用指南:使用Pytest Allure測試框架新增用例失敗截圖框架
- 手工測試用例與自動化測試用例的區別
- 萬能測試用例及測試用例編寫方法(待更新)
- 測試用例驅動閱讀Express原始碼Express原始碼
- 測試用例的方法
- 黑盒測試用例二
- 面經-測試用例
- postman寫測試用例Postman
- 【黑盒測試】測試用例的常用方法
- 開發測試用例:手動擼程式碼 VS 填鴨式編寫
- 測試用例最佳實踐
- 怎樣寫測試用例?
- 測試用例編寫方法
- httprunner 4.x學習 - 12 測試用例引用另一個測試用例HTTP
- python TestCase測試用例怎麼用Python
- APP測試設計測試用例的要點APP
- 【功能測試】兩部電梯的測試用例
- pytest多程式/多執行緒執行測試用例執行緒
- 測試程式碼
- Python 禪道測試用例助手Python
- 測試用例設計標準
- 介面測試用例編寫和測試關注點
- 探索性測試的分類與測試用例
- 程式設計師程式碼面試指南程式設計師面試
- MYSQL程式碼顯示測試測試MySql
- 『測試基礎』| 如何理解測試用例管理和缺陷管理?
- teprunner測試平臺測試計劃批量執行用例
- 測試程式碼高亮
- [譯] 測試 React & Redux 應用良心指南ReactRedux
- 探索性測試及基本用例
- IDEA中用junit寫基本測試用例Idea