我正在考虑使用Python来教授入门编程,我正在寻找一个轻量级的单元测试框架。我已经看了一下unittest,而且 - 据我所知 - 它看起来很疯狂非 -lightweight。
例如,这是我想要写的内容:
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);我正在寻找更多的东西:它应该能够检查带有容差的数字,它应该支持仅打印失败的测试用例,它应该能够告诉你有多少测试用例失败了。再次,我相信这段代码可以写出来;我只是想避免重新发明轮子。
答案 0 :(得分:5)
我会推荐Doctest。
您的示例如下:
def f(x):
"""
>>> f(3)
5
"""
return x + 2
为什么:
答案 1 :(得分:4)
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测试,也可以运行doctests。
答案 2 :(得分:2)
两种常见的替代方案是nose和py.test。它们都具有非常轻量级的语法,但也是功能齐全的。
以下是对鼻子的扩展介绍:http://ivory.idyll.org/articles/nose-intro.html
这是一个使用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 =========================
答案 3 :(得分:1)
import unittest
def f(x):
return x + 2
class TestFunctionF(unittest.TestCase):
def test_f(self):
self.assertEqual(f(3), 5)
if __name__ == '__main__':
unittest.main()
产地:
----------------------------------------------------------------------
Ran 1 test in 0.000s
OK