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结合报错如何解决?狗书单元测试这一块

2 回复

我猜你是在看《Flask Web开发实战》(狗书)时遇到了问题。结合coverage和unittest时常见的报错主要有两个原因:

  1. 导入路径问题:你的测试文件可能没正确找到要测试的应用模块。
  2. 测试运行器配置问题: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()

回到顶部