我想在小型自包含程序中使用Python 3.3和单元测试,即我不想将其拆分为命令行部分和“功能”部分,如果它是在启动时可以进行测试它本身就在命令行上。
所以我有这个小程序:
import unittest
def stradd(a, b):
return a + b
class test_hello(unittest.TestCase):
def test_1(self):
self.assertEqual(stradd("a", "b"), "ab")
unittest.main()
print(stradd("Hello, ", "world"))
不幸的是,从未到达print(),因为unittest.main()退出程序。即使它不会退出,它也会将各种输出打印到我不希望在正常操作中看到的屏幕。
有没有办法以无声方式运行测试,只要没有错误?当然,如果出现问题,他们应该大声抱怨。
我见过Run python unit tests as an option of the program,但这也不能回答我的问题。
答案 0 :(得分:3)
使用普通unittest
模块可以达到您想要的效果。你只需要编写自己的简单测试运行器。像这样:
import unittest
def stradd(a, b):
return a + b
class test_hello(unittest.TestCase):
def test_1(self):
self.assertEqual(stradd("a", "b"), "ab")
def run_my_tests(test_case):
case = unittest.TestLoader().loadTestsFromTestCase(test_case)
result = unittest.TestResult()
case(result)
if result.wasSuccessful():
return True
else:
print("Some tests failed!")
for test, err in result.failures + result.errors:
print(test)
print(err)
return False
if run_my_tests(test_hello):
# All tests passed, so we can run our programm.
print(stradd("Hello, ", "world"))
如果所有测试成功通过, run_my_tests
函数将返回True
。但是如果测试失败,它会将所有错误/失败打印到stdout。例如:
$ python myscript.py
Hello, world
$ # And now the test fails...
$ python myscript.py
Some tests failed!
test_1 (__main__.test_hello)
Traceback (most recent call last):
File "myscript.py", line 8, in test_1
self.assertEqual(stradd("a", "c"), "ab")
AssertionError: 'ac' != 'ab'
答案 1 :(得分:1)
只需使用python的nosetests或py.test即可。然后你可以按照你想要的方式编写代码 - 除了 nothing ,除了test_
函数添加到程序中并通过
$ nosetests filename.py
或
$ py.test filename.py
也好,不需要上课:
def test():
assert stradd("a", "b") == "ab"
虽然它没有回答你“默默地跑”部分。对我来说这+命令行历史记录工作正常。对于微小的程序,基本上是片段。
答案 2 :(得分:0)
其他测试框架在这里没有帮助,因为它不是测试框架,这是一个问题。说py.test
是最好的那个:)。
问题是unittest.main()
函数专门用于以标准方式运行测试,并且不提供以任何方式自定义此过程的方法。这给我们留下了两个选择
subprocess
在unittest.main()
的单独进程中运行测试,请检查
输出并继续运行我们的程序,如果所有测试都通过unittest.main()
并使用其他设施
由unittest模块提供一旦我找到更多空闲时间,我就会写下这两个选项。