I am refactoring a legacy Python project, which did not have any unittests.
Assuming a directory structure like this:

C:.
├───scripts
│       schema.sql
├───src
│   │   .coverage
│   │   bar.py
│   │   baz.py
│   │   foo.py
│   │   __init__.py
│   └───utils
│           __init__.py
└───tests
        .coverage
        test_foo.py

福.py看起来像:

import bar
import baz
import requests
import psycopg2
import os
import sys

print(requests.__file__)


def foo():
    return 'foo'


if __name__ == '__main__':
    print(foo())

test_福.py看起来像:

import unittest
import foo


class Test_Foo(unittest.TestCase):
    def test_foo(self):
        result = foo.foo()
        self.assertEqual(result, 'foo')

我刚刚定义了foo.py个测试,运行unittests:

python.exe -m unittest discover -s . && coverage report -m
C:\data\...\venv\lib\site-packages\requests\__init__.py
.
----------------------------------------------------------------------
Ran 1 test in 0.000s

OK
Name                           Stmts   Miss  Cover   Missing
------------------------------------------------------------
C:\data\myProject\src\bar.py       2      1    50%   2
C:\data\myProject\src\foo.py      11      4    64%   6-8, 12, 16
------------------------------------------------------------
TOTAL                             13      5    62%

使用nose,输出显示了"站点包"中包的缺失测试,我不想看到:

nosetests -w ..\src --cover-inclusive  --cover-tests --with-coverage --cover-erase --cover-html

Name                                    Stmts   Miss  Cover
-----------------------------------------------------------
bar.py                                      2      1    50%
baz.py                                      2      1    50%
certifi\__init__.py                         2      2     0%
...
decimal.py                                 10     10     0%
encodings\idna.py                         180    180     0%
hmac.py                                    60     60     0%
http\client.py                            756    756     0%
http\client.py                            756    756     0%
http\cookiejar.py                        1102   1102     0%
http\cookies.py                           248    248     0%
idna\__init__.py                            4      4     0%
idna\__init__.py                            4      4     0%
idna\core.py                              291    291     0%
idna\core.py                              291    291     0%
idna\idnadata.py                            4      4     0%
idna\idnadata.py                            4      4     0%
idna\intranges.py                          30     30     0%
idna\intranges.py                          30     30     0%
idna\package_data.py                        1      1     0%
idna\package_data.py                        1      1     0%
mimetypes.py                              194    194     0%
numbers.py                                134    134     0%
psycopg2\__init__.py                       22     22     0%
...
src\__init__.py                             0      0   100%
src\bar.py                                  2      1    50%
src\baz.py                                  2      1    50%
src\foo.py                                 11      2    82%
src\utils\__init__.py                       0      0   100%
stringprep.py                              65     65     0%
urllib3\__init__.py                        34     34     0%
...
-----------------------------------------------------------
TOTAL                                   14613  14600     1%
----------------------------------------------------------------------
Ran 0 tests in 0.000s

OK

如何查看常规的unittest/coverage报告以及工作目录中未经测试的其他文件?

推荐答案

You could use pytest.
Recreating your directory structure and optionally removing import baz in foo.py:

import bar                    
# import baz                  
import requests               
import psycopg2               
import os                     
import sys                    
                              
print(requests.__file__)      
                              
                              
def foo():                    
    return 'foo'              
                              
                              
if __name__ == '__main__':    
    print(foo())  

        

执行pytest:

pytest --cov-report html:cov_html --cov-report term-missing --cov=src tests/

输出:

===== test session starts 
... omitted output ...
collected 1 item

tests\test_foo.py .                                                                                                                                                                              [100%]

----------- coverage: platform win32, python 3.7.9 -----------
Name                    Stmts   Miss  Cover   Missing
-----------------------------------------------------
src\__init__.py             0      0   100%
src\bar.py                  2      1    50%   2
src\baz.py                  2      2     0%   2-3
src\foo.py                 10      1    90%   16
src\utils\__init__.py       0      0   100%
-----------------------------------------------------
TOTAL                      14      4    71%
Coverage HTML written to dir cov_html

pytest表示baz.py的覆盖率为0%

Python相关问答推荐

从收件箱获取特定列中的重复行

隐藏QComboBox的指示器(qdarkstyle)

如何将我的位置与光强度数据匹配到折射图案曲线中?

有什么方法可以避免使用许多if陈述

Python plt.text中重叠,包adjust_text不起作用,如何修复?

优化在numpy数组中非零值周围创建缓冲区的函数的性能

使用polars .滤镜进行切片速度比pandas .loc慢

将numpy数组存储在原始二进制文件中

如何自动抓取以下CSV

@Property方法上的inspect.getmembers出现意外行为,引发异常

TARete错误:类型对象任务没有属性模型'

为什么tkinter框架没有被隐藏?

如何让剧作家等待Python中出现特定cookie(然后返回它)?

未删除映射表的行

将两只Pandas rame乘以指数

修复mypy错误-赋值中的类型不兼容(表达式具有类型xxx,变量具有类型yyy)

如何设置视频语言时上传到YouTube与Python API客户端

所有列的滚动标准差,忽略NaN

如何在PySide/Qt QColumbnView中删除列

Cython无法识别Numpy类型