在模块中编写单元测试的正确方法?

时间:2013-12-08 10:30:12

标签: python unit-testing module

我想使用模块文件calc.py中的unittest为我的主文件MyTests.py编写测试。

这是我的主要python文件calc.py

import myTests

def first(x):
    return x**2

def second(x):
    return x**3

def main():
    one = first(5)
    two = second(5)

if __name__ == "__main__":
    main()
    try:
        myTests.unittest.main()
    except SystemExit:
        pass

这是我的MyTests.py文件:

import unittest
import calc

class TestSequenceFunctions(unittest.TestCase):
    def setUp(self):
        self.testInput = 10

    def test_first(self):
        output = calc.first(self.testInput)
        correct = 100
        assert(output == correct)

    def test_second(self):
        output = calc.second(self.testInput)
        correct = 1000
        assert(output == correct)

当我运行calc.py时,我得到以下输出:

----------------------------------------------------------------------
Ran 0 tests in 0.000s

OK

为什么unittest打印出“Ran 0 test”? 在模块中编写unittest的正确方法是什么?

1 个答案:

答案 0 :(得分:3)

unittests.main()在当前模块中查找TestCase个实例 。你的模块没有这样的测试用例;它只有一个myTests全局。

最佳做法是自行运行测试 。将__main__部分添加到myTests.py文件中:

import unittest
import calc

class TestSequenceFunctions(unittest.TestCase):
    def setUp(self):
        self.testInput = 10

    def test_first(self):
        output = calc.first(self.testInput)
        correct = 100
        assert(output == correct)

    def test_second(self):
        output = calc.second(self.testInput)
        correct = 1000
        assert(output == correct)

if __name__ == '__main__':
    unittest.main()

并改为运行python myTests.py

或者,将导入的myTests模块传入unittest.main()。您可能希望将import myTests向下移动__main__,因为您也有循环导入。在你的情况下,这很好,myTests在测试用例之外不使用来自calc的任何全局变量,但最好明确这一点。

if __name__ == "__main__":
    main()
    try:
        import myTests
        myTests.unittest.main(myTests)
    except SystemExit:
        pass