如何在自包含程序中使用Python单元测试?

时间:2012-11-25 10:10:26

标签: python unit-testing

我想在小型自包含程序中使用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,但这也不能回答我的问题。

3 个答案:

答案 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的nosetestspy.test即可。然后你可以按照你想要的方式编写代码 - 除了 nothing ,除了test_函数添加到程序中并通过

运行测试
$ nosetests filename.py

$ py.test filename.py

也好,不需要上课:

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

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

答案 2 :(得分:0)

其他测试框架在这里没有帮助,因为它不是测试框架,这是一个问题。说py.test是最好的那个:)。

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

  • 使用subprocessunittest.main()的单独进程中运行测试,请检查 输出并继续运行我们的程序,如果所有测试都通过
  • 单独留下高级别unittest.main()并使用其他设施 由unittest模块提供

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