Python中coverage和unittest结合报错如何解决?狗书单元测试这一块
最近在看 flask web 开发一书,看到获取代码测试报告那里,对照的书,使用脚本启动 coverage。运行的时候报错 AssertionError: Expected current collector to be <Collector at 0x10366b0d0: CTracer>, but it's <Collector at 0x103cac4d0: CTracer>
这是我的代码 app = creat_app('development') app.app_context().push() app.config['debug'] = True manager = Manager(app)
COV = None if os.environ.get('FLASK_COVERAGE'): import coverage COV = coverage.coverage(branch=True, include='app/*') COV.start()
@manager.command def test(cover=False): """run the unittest""" if cover and not os.environ.get('FLASK_COVERAGE'): import sys os.environ['FLASK_COVERAGE'] = '1' os.execvp(sys.executable, [sys.executable] + sys.argv) import unittest tests = unittest.TestLoader().discover('test') unittest.TextTestRunner(verbosity=2).run(tests) if COV: COV.stop() COV.save() print 'Coverage Summary:' COV.report() basedir = os.path.abspath(os.path.dirname(file)) covdir = os.path.join(basedir, 'tmp/coverage') COV.html_report(directory=covdir) print 'html version: file://%s/index.html' % covdir COV.erase()
if name == 'main': print app.url_map db.drop_all() db.create_all() manager.run()
COV.stop() 这一句报错 我终端运行的是 python manager.py test --cover
Python中coverage和unittest结合报错如何解决?狗书单元测试这一块
我猜你是在看《Flask Web开发实战》(狗书)时遇到了问题。结合coverage和unittest时常见的报错主要有两个原因:
- 导入路径问题:你的测试文件可能没正确找到要测试的应用模块。
- 测试运行器配置问题:coverage和unittest的调用方式不匹配。
解决方案:
首先确保你的项目结构是这样的:
your_project/
├── app/
│ ├── __init__.py
│ └── ... # 你的Flask应用代码
├── tests/
│ ├── __init__.py
│ └── test_basic.py # 你的测试文件
└── setup.py # 可选
然后使用这个标准的coverage运行命令:
# 方法1:直接运行所有测试
coverage run -m pytest tests/
# 方法2:如果你坚持用unittest
coverage run -m unittest discover tests/
# 生成报告
coverage report
coverage html # 生成HTML报告
如果还有导入错误,在测试文件开头添加路径设置:
import sys
import os
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
from app import create_app, db
关键检查点:
- 确保
tests/目录下有__init__.py文件(即使是空的) - 确认你的Flask应用工厂函数名为
create_app() - 测试类要继承
unittest.TestCase
一句话建议:检查项目结构和导入路径,用coverage run -m pytest替代直接运行。
app = creat_app(‘development’)
app.app_context().push()
app.config[‘debug’] = True
manager = Manager(app)
COV = None
if os.environ.get(‘FLASK_COVERAGE’):
import coverage
COV = coverage.coverage(branch=True, include=‘app/*’)
COV.start()
.command
def test(cover=False):
“”“run the unittest”""
if cover and not os.environ.get(‘FLASK_COVERAGE’):
import sys
os.environ[‘FLASK_COVERAGE’] = ‘1’
os.execvp(sys.executable, [sys.executable] + sys.argv)
import unittest
tests = unittest.TestLoader().discover(‘test’)
unittest.TextTestRunner(verbosity=2).run(tests)
if COV:
COV.stop()
COV.save()
print ‘Coverage Summary:’
COV.report()
basedir = os.path.abspath(os.path.dirname(file))
covdir = os.path.join(basedir, ‘tmp/coverage’)
COV.html_report(directory=covdir)
print ‘html version: file://%s/index.html’ % covdir
COV.erase()
if name == ‘main’:
print app.url_map
db.drop_all()
db.create_all()
manager.run()

