环境
- python==3.7
- pytest==7.1.0
- pytest-cov==3.0.0
unittest 执行命令
cd 进去项目路径,ut 运行test开头的文件夹,.coverager配置文件可配置需要排除的文件。执行完成会生成html覆盖率报告。
python -m pytest --cov-config=.coveragerc --cov=./ --cov-report=html --cov-report=term
.coveragerc
[run]
omit =
services/db_handle.py
Mock
1. mock import
mock掉文件开头import的方法
import sys
from unittest.mock import patch, Mock
sys.modules["your_path.your_module"] = Mock()
2. mock 方法
用patch装饰器,路径写到需要mock的方法名
@patch("app.uploader.Uploader.main", return_value="testMd5")
3. mock 掉某个装饰器
mock某个装饰器,需要在导入前
# mock flask认证jwt装饰器
patch("flask_jwt_extended.jwt_required", mock_decorate).start()
Demo
以某个flask应用为例
import unittest
from flask import Flask
from unittest.mock import patch
class TestDemo(unittest.TestCase):
def setUp(self):
# mock import
sys.modules["services.upload"] = Mock()
# mock_decorate为空的装饰器 替换jwt_required装饰器
patch("flask_jwt_extended.jwt_required", mock_decorate).start()
self.app = Flask(__name__)
self.app.config.update({"TESTING": True})
# 只导入要测的一个路由
from app import downloader, api
self.app.register_blueprint(api)
def tearDown(self):
# print("tearDown")
pass
def test_demo(self):
with self.app.test_client() as c:
response = c.post("api/download", data=data)
self.assertEqual(response.status_code, 200)
if __name__ == '__main__':
unittest.main()