4

我正在考虑使用 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)

……就是这样。肯定有人写了这个工具,而我只是没有找到它?

(对于任何煽动火焰的行为,请提前道歉。这是一个严肃的问题。)

自我编辑:

在任何人指出这一点之前:是的,我可以写 def checkEqual(a,b): print(a==b) ; 我正在寻找更多的东西:它应该能够检查带有公差的数字,它应该支持只打印失败的测试用例,它应该能够告诉你有多少测试用例失败了。同样,我相信可以编写此代码;我只是想避免重新发明轮子。

4

4 回答 4

5

我会推荐Doctest

您的示例如下所示:

def f(x):
    """
    >>> f(3)
    5
    """
    return x + 2

为什么?:

  1. 超级简单:“当我运行这个东西时,我应该得到这个答案”
  2. 它适用于功能级别 - 这可能允许您在上课之前引入测试
  3. 反映交互式 Python 体验。
于 2012-05-03T19:00:25.623 回答
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。

于 2012-05-03T19:30:33.750 回答
2

两个常见的替代方案是nosepy.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 =========================
于 2012-05-03T20:16:20.347 回答
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
于 2012-05-03T19:02:01.930 回答