用nose集成测试文档
(#todo),但是如果你开始把你的doctest扩大到很多的类和方法呢?把运行测试作为构建过程的一个部分是很难管理的,通常的做法是,维护一个列表,而这个列表包含着你需要执行doctest的文件。
幸运的是,你可以使用前面提到的,一些与nosetest引擎紧密耦合的特性。nosetest允许你在正常的nosetest命令后面添加一个标志(flag),用来搜寻文件中的doctest并执行他们。这让你能够运行doctest前面介绍的所有的方便的特性,包括颜色化输出、debug、清晰可读的栈追踪来解释为什么doctest失败了。
让nosetest支持doctest,你只需要在nosetests后面加一个标志(-with-doctest)就可以了。nosetest会搜索所有文件中的doctest并和unittest(第二第三章)一样执行他们(# todo)。
运行nosetests命令,不加flag,它只运行Calculate类的两个单元测试。
nosetests
..........................
-------------------------------------------------------------------
Ran 2 tests in 0.064s
OK
现在,当你为doctest添加选项(flag),他会为Calculate类添加你写的关于add函数的doctest。需要注意的是,如果你之前在你的doctest中使用extraglob来展示一些页面,这可能会导致失败。因为extraglob是直接在 __main__ 中设置而不是被nosetest引擎调用的。因为这个,你可能需要坐垫什么来让他支持extraglob,大部分人的做法是在doctest中新建一个类实例来继续你的nosetest。
$ nosetests --with-doctest
..........................
-------------------------------------------------------------------
Ran 3 tests in 0.064s
OK
为了证明他确实是你想要的,你可以加上verbose标志位来验证nosetest到底是怎么被执行的。
$ nosetests --with-doctest -v
Doctest: app.calculate.Calculate.add ... ok
test_add_method_raises_typeerror_if_not_ints
(test.calculate_test.TestCalculate) ... ok
test_add_method_returns_correct_result
(test.calculate_test.TestCalculate) ... ok
dcotest被成功执行,并且被清晰的标志为doctest。
最后,如果你的doctest失败了,比如使用了add函数,期望它1加1等于3,nosetest会清晰的指出,问题在哪里和他为什么会发生。
$ nosetests --with-doctest
F..
================================================================
FAIL: Doctest: app.calculate.Calculate.add
----------------------------------------------------------------
Traceback (most recent call last):
File
"/usr/local/Cellar/python/2.7.5/Frameworks/Python.framework/Vers
ions/2.7/lib/python2.7/doctest.py", line 2201, in runTest
raise
self.failureException(self.format_failure(new.getvalue()))
AssertionError: Failed doctest test for
app.calculate.Calculate.add
File "/Users/username/workspace/python_testing/app/calculate.py",
line 6, in add
----------------------------------------------------------------
File "/Users/username/workspace/python_testing/app/calculate.py",
line 10, in app.calculate.Calculate.add
Failed example:
c.add(1,1)
Expected:
3 Got:
2
----------------------------------------------------------------
Ran 3 tests in 0.064s
FAILED (failures=1) *
(# todo 代码高亮)
加粗的部分是nosetest给出的细节。它指出了涉及的行号、文件、类、方法,展示了方法或者函数的参数,包括了它的期望输出和它的实际的结果。这让你有信心的修复代码的问题,亦或是更新你的doctest代码。在你每次更改你的代码或者测试代码后,都应该运行你的测试。通过经常运行代码,能够让代码的改变对测试的输出影响最小,这样可以让定位问题和修复他们变的简单。