python中的轻量级单元测试
我正在考虑使用Python教授入门级编程,我正在寻找一个轻量级的单元测试框架。我已经看了unittest,而且——据我所知——它看起来非常不轻 例如,以下是我希望能够写的内容:python中的轻量级单元测试,python,racket,Python,Racket,我正在考虑使用Python教授入门级编程,我正在寻找一个轻量级的单元测试框架。我已经看了unittest,而且——据我所知——它看起来非常不轻 例如,以下是我希望能够写的内容: import unittest def f(x): return x+2 checkEqual(f(3),5) 。。。没有别的了。为了向你们展示我来自何方,以下是我用Racket的初级学生语言写的内容: (define (f x) (+ x 2)) (check-expect (f 3) 5) 。。。就
import unittest
def f(x):
return x+2
checkEqual(f(3),5)
。。。没有别的了。为了向你们展示我来自何方,以下是我用Racket的初级学生语言写的内容:
(define (f x)
(+ x 2))
(check-expect (f 3) 5)
。。。就这样。肯定有人写过这个工具,而我就是找不到
(提前为任何火焰诱饵的出现道歉。这是一个严肃的问题。)
自我编辑:
在任何人指出这一点之前:是的,我可以写def checkEqual(a,b):print(a==b);我正在寻找更多的东西:它应该能够检查带有公差的数字,它应该支持只打印失败的测试用例,它应该能够告诉您有多少测试用例失败。再次重申,我相信这段代码是可以编写的;我只是想避免重新发明轮子。我推荐
您的示例如下所示:
def f(x):
"""
>>> f(3)
5
"""
return x + 2
为什么
----------------------------------------------------------------------
Ran 1 test in 0.000s
OK
Doctests是一个很好的建议,但是如果您想接近示例代码,我建议使用py.test(pytest.org)。您的示例将编写如下内容:
def f(x):
return x+2
def test_equal(): # py.test looks for functions that start with test_
assert f(3) == 5
如果我把它放在一个名为tt.py的文件中,并用py.test运行它,它看起来像这样:
w:\tmp>py.test tt.py
============================= test session starts =============================
platform win32 -- Python 2.6.6 -- pytest-2.2.3
collected 1 items
tt.py .
========================== 1 passed in 0.01 seconds ===========================
如果我将断言更改为f(3)==6,然后再次运行它,我会得到:
w:\tmp>py.test tt.py
============================= test session starts =============================
platform win32 -- Python 2.6.6 -- pytest-2.2.3
collected 1 items
tt.py F
================================== FAILURES ===================================
_________________________________ test_equal __________________________________
def test_equal(): # py.test looks for functions that start with test_
> assert f(3) == 6
E assert 5 == 6
E + where 5 = f(3)
tt.py:5: AssertionError
========================== 1 failed in 0.01 seconds ===========================
py.test还可以扩展,您可以让它运行覆盖率、在多个CPU上分发测试等。它还可以查找和运行unittest测试,还可以运行Doctest。两种常见的替代方法是和。它们都有一个非常轻量级的语法,但也功能齐全 下面是对nose的扩展介绍: 下面是一个使用py.test的示例函数和测试:
# content of test_sample.py
def func(x):
return x + 1
def test_answer():
assert func(3) == 5
从命令行运行测试:
$ py.test
=========================== test session starts ============================
platform darwin -- Python 2.7.1 -- pytest-2.2.2
collecting ... collected 1 items
test_sample.py F
================================= FAILURES =================================
_______________________________ test_answer ________________________________
def test_answer():
> assert func(3) == 5
E assert 4 == 5
E + where 4 = func(3)
test_sample.py:5: AssertionError
========================= 1 failed in 0.02 seconds =========================
我想你是想在我的机器上写:
从unittest导入checkEqual
,这只是发出一个错误信号:“ImportError:无法导入name checkEqual”。在我的机器上,如果我导入unittest
<代码>名称错误:未定义名称“checkEqual”右侧。。。两者都不起作用。正如我写的,“我希望能够写…”(强调补充)。下面的答案就是如此!哎哟请原谅我的非价值中立措辞,但从我坐的地方看,这看起来。。。嗯。。。让我们说,非常非常非最优。任何基于字符串解析的东西都可能非常脆弱。我可以看到这里有十三件事出了问题。很不好。在这里,我真是咬牙切齿。@JohnClements Doctest显然不是最健壮的单元测试框架,但搞错字符串并不是什么大问题,因为它的思想是将解释器的准确输入和输出传递到doc字符串中。我认为它不适合你的情况,主要是因为它比其他任何东西都更适合简单的回归测试,而且我假设你想以更TDD的方式教学。不过,不要抨击这个框架,这是一个非常简单的方法,可以确保小项目中的工作正常进行!你能想象第一天就让一个学生把所有的东西都打出来吗?为什么,是的。是的,我能想象。好的,也许第二天:)谢谢你幽默的回答!我很高兴我没有让你生气这看起来是最好的。我并不完全喜欢反射风格的“函数-从测试开始”,但除此之外,它看起来是一个不错的解决方案。谢谢
$ py.test
=========================== test session starts ============================
platform darwin -- Python 2.7.1 -- pytest-2.2.2
collecting ... collected 1 items
test_sample.py F
================================= FAILURES =================================
_______________________________ test_answer ________________________________
def test_answer():
> assert func(3) == 5
E assert 4 == 5
E + where 4 = func(3)
test_sample.py:5: AssertionError
========================= 1 failed in 0.02 seconds =========================