python中的轻量级单元测试

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) 。。。就

我正在考虑使用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);我正在寻找更多的东西:它应该能够检查带有公差的数字,它应该支持只打印失败的测试用例,它应该能够告诉您有多少测试用例失败。再次重申,我相信这段代码是可以编写的;我只是想避免重新发明轮子。

我推荐

您的示例如下所示:

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

  • 它非常简单:“当我运行这个东西时,我应该得到这个答案”
  • 它在函数级工作——这可能允许您在类之前引入测试
  • 反映了交互式Python体验
  • 产生:

    ----------------------------------------------------------------------
    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 =========================