3

我想在小型自包含程序中使用带有单元测试的 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 作为程序的一个选项,但这也不能回答我的问题。

4

3 回答 3

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_testsTrue如果所有测试都成功通过,函数将返回。但如果测试失败,它会将所有错误/失败打印到标准输出。例如:

$ 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'
于 2012-11-26T13:12:46.350 回答
1

只需使用 python 的nosetestspy.test。然后你可以完全按照你想要的方式编写代码——除了添加到程序中的函数并通过以下方式运行测试之外什么都没有test_

$ nosetests filename.py

或者

$ py.test filename.py

是的,也不需要上课:

def test():
    assert stradd("a", "b") == "ab"

虽然它没有回答你“默默运行”的部分。对我来说,这个 + 命令行历史可以正常工作。对于小程序来说,基本上是片段。

于 2012-11-25T12:03:35.437 回答
0

其他测试框架在这里没有帮助,因为这里的问题不是测试框架。话虽如此,那py.test是最好的:)。

问题是unittest.main()函数专门设计用于以标准方式运行测试,并且不提供以任何方式自定义此过程的方法。这给我们留下了两个选择

  • 用于subprocess在单独的进程中运行测试 using unittest.main(),检查输出,如果所有测试都通过,则继续运行我们的程序
  • 不理会高层unittest.main(),使用 unittest 模块提供的其他设施

一旦我找到更多空闲时间,我会写下这两个选项。

于 2012-11-25T23:14:33.270 回答