我有一个金字塔Web应用程序,它使用Jinja2作为模板引擎.它使用Pyramid测试助手以及py.test和coverage插件进行测试.但覆盖仅适用于我的Python代码.有没有办法检查Jinja模板的覆盖范围?
由于Jinja被编译成Python代码,并且Armin会在异常情况下给出精确的行号,所以至少在理论上我是可能的.任何提示都将非常感激.
我有一个非常大的python项目,有一个非常大的测试套件.最近我们决定量化测试覆盖的质量.
我正在寻找一种自动化测试覆盖率报告生成的工具.理想情况下,我希望有一个有吸引力的,易于阅读的报告,但如果能让它快速发挥作用,我会满足于不太有吸引力的报道.
我试过Nose,这还不够好:它与distribute/setuptools的命名空间包功能不兼容.不幸的是,鼻子覆盖对我们来说永远不会有用,因为我们充分利用了这个功能 这真是一种耻辱,因为Nose似乎在Hudson(大多数)工作得非常好
作为替代方案,我听说有一种方法可以在Eclipse中进行Python覆盖率分析,但我并没有完全锁定完美的技术.
欢迎任何建议!
仅供参考我们在Windows XP 32bit上使用Python 2.4.4
我对python测试相当绿色,所以这可能是我做错了.
当我运行我的测试时,测试运行器工作正常并且覆盖范围也很好..但是在两者之间我得到一个断言错误:
Traceback (most recent call last):
File "/usr/local/bin/coverage", line 9, in <module>
load_entry_point('coverage==3.5.1', 'console_scripts', 'coverage')()
File "/usr/local/lib/python2.7/dist-packages/coverage/cmdline.py", line 657, in main
status = CoverageScript().command_line(argv)
File "/usr/local/lib/python2.7/dist-packages/coverage/cmdline.py", line 526, in command_line
self.coverage.stop()
File "/usr/local/lib/python2.7/dist-packages/coverage/control.py", line 389, in stop
self.collector.stop()
File "/usr/local/lib/python2.7/dist-packages/coverage/collector.py", line 262, in stop
assert self._collectors[-1] is self
AssertionError
Run Code Online (Sandbox Code Playgroud)
为了使事情变得更加困难,我正在尝试测试命令行实用程序.这意味着我必须告诉覆盖范围以涵盖子进程调用.
我认为我已经完成了这部分工作,因为报道现在正在报告正在运行的脚本的覆盖百分比.但是自从我完成覆盖工作后,我无法摆脱AssertionError.
有些人帮助理解真正意义上的错误.我的所有代码都可以在github上找到:
快速运行:
cd /tmp/ && git clone git://github.com/h3/django-duke-client.git
cd django-duke-client && chmod a+x run_tests && ./run_tests
Run Code Online (Sandbox Code Playgroud)
谢谢
更新
我在另一台计算机上运行测试,我得到了相同的AssertionError ..加上一个新的TypeError.测试再次正确运行,即使出现这些错误,覆盖范围似乎也能正常运行.
...
Ran 9 tests …Run Code Online (Sandbox Code Playgroud) 当我编写测试或调试代码时,我希望能够添加一行Python,如果该行从未执行过,它将通知我.这可能吗?
例如,我希望能够编写如下代码:
def f(x):
if x==0:
check_covered()
return 1
elif x==1:
check_covered()
return 2
else:
check_covered()
return 3
f(1)
f(2)
print_all_missing_cases()
Run Code Online (Sandbox Code Playgroud)
我希望输出告诉我其中一个分支从未被覆盖过.
我可以使用装饰器执行此操作,如下所示:
missing_fns = set()
def covered(h):
missing_fns.add(h.func_name)
def h2(*args):
missing_fns.remove(h.func_name)
return h(*args)
return h2
@covered
def f(a):
return a+1
@covered
def g(a):
return a+2
f(0)
for x in missing_fns:
print x,'is never called'
Run Code Online (Sandbox Code Playgroud)
但我正在努力寻找在编译函数时激活的东西,我可以将其挂钩.
如果我将递增值传递给每个实例(例如check_covered(0),check_covered(1),check_covered(2),...),这也很简单,但是当我复制或删除代码时,这会变得很混乱.
可以通过运行代码覆盖率工具来获取此信息,但如果可能的话,我更愿意使用一些我有机会理解的简单Python代码来完成此操作.
我不太明白Python的分支覆盖统计数据试图告诉我什么.给出表单的代码
def f(a, b):
c = (i for i in a)
d = (j for j in b) # Line of interest
return dict(zip(c, d))
print(f(['a', 'b'], [1, 2]))
Run Code Online (Sandbox Code Playgroud)
在单元测试期间导入的,Python的标准分支覆盖率告诉我该# Line of interest行仅被部分覆盖(n->-n在CLI输出中,漂亮的HTML报告中的"n↛exit[?]").
返回的dict清楚地打印出来,用空列表执行仍会产生未覆盖的行.
我是否误解了覆盖范围输出?这闻起来像臭虫吗?
Python 3.5.1,Coverage 4.0.3
我们使用Hudson和coverage.py来报告测试套件的代码覆盖率.哈德森将报道分解为:
Coverage.py仅报告测试期间执行/导入的文件的覆盖范围,因此在测试期间未执行的任何文件似乎都无视.是否存在文件无法报告100%覆盖率的实例?
我正在尝试使用Django覆盖,但我似乎得到了不正确的结果.我的应用名为"stats",我有这个测试:
class ListSchoolsTest(TestCase):
def test_initial_list(self):
self.client.login(username='skeezy', password='skeezy')
resp = self.client.get("/stats/list_schools/")
self.assertEqual(resp.status_code, 200)
Run Code Online (Sandbox Code Playgroud)
在命令行上,我运行:
coverage run --source="." manage.py test stats
Run Code Online (Sandbox Code Playgroud)
测试通过了.我的所有观点目前都在stats/views.py中
但是,当我运行"报道报告"时,我得到这一行:
Name Stmts Miss Cover
----------------------------------------
<snip>
stats/views 110 110 0%
Run Code Online (Sandbox Code Playgroud)
任何想法我(不)这样做会导致报告报告stats/views.py中遗漏的所有行,即使它必须被击中以便测试通过?(就像腰带和吊带一样,我在我的视图中放了一个印刷声明,它肯定会被击中.)
我试图找到一个python代码覆盖率工具,该工具可以衡量语句中是否包含子表达式:
例如,我想看看在下面的示例中是否涵盖了condition1 / condition2 / condtion3?
if condition1 or condition2 or condition3: x = true_value
Run Code Online (Sandbox Code Playgroud) 对于给定的python文件,其顶部有以下行:
import traceback
import datetime
from django.contrib.contenttypes import generic
from django.contrib.contenttypes.models import ContentType
from django.db import models
from django.conf import settings
Run Code Online (Sandbox Code Playgroud)
如何编写单元测试,导致鼻子没有显示"缺失"的那些线?
我是 Jenkins 和 Docker 的新手,即使经过一些研究,我也没有找到做这些事情的方法。
我想要 :
当我在本地使用 Docker 尝试时,它正在工作。我创建了一个 Dockerfile,它使用所需的库和其中的源代码创建一个 docker 镜像,然后在创建容器并运行测试时调用一个脚本。我可以看到它正在工作,因为我使用了 cat 并且能够在我的终端中看到生成的报告。
我的问题是:如何访问 Jenkins 容器内生成的报告,并在之后使用插件读取它们。
编辑:所以这里有一个我正在尝试做的例子,这样你就可以有一个更好的主意。
首先,我的 Dockerfile 示例:
# starting from debian image
FROM debian
# install pytest and coverage to execute my tests
RUN apt-get update && apt-get install -y \
python-pytest \
python-coverage
# add source files to the image
ADD . /HelloPython/
WORKDIR /HelloPython/
# execute shell script which run tests
CMD sh …Run Code Online (Sandbox Code Playgroud) python-coverage ×10
python ×8
coverage.py ×5
unit-testing ×3
django ×2
nose ×2
docker ×1
hudson ×1
jenkins ×1
jinja2 ×1
pytest ×1
testing ×1