在我们的团队中,我们像这样定义大多数测试用例:

一个“框架”类ourtcfw.py:

import unittest

class OurTcFw(unittest.TestCase):
    def setUp:
        # Something

    # Other stuff that we want to use everywhere

还有很多测试用例,比如testMyCase.py:

import localweather

class MyCase(OurTcFw):

    def testItIsSunny(self):
        self.assertTrue(localweather.sunny)

    def testItIsHot(self):
        self.assertTrue(localweather.temperature > 20)

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

当我在编写新的测试代码并希望经常运行它以节省时间时,我确实会在所有其他测试前面加上“__”。但它很麻烦,让我无法专心编写代码,而且它所产生的提交噪音非常烦人。

因此,例如,当对testItIsHot()进行更改时,我希望能够这样做:

$ python testMyCase.py testItIsHot

并且让单元测试只运行testtishot ()

我怎样才能做到呢?

我试图重写if __name__ == "__main__":部分,但由于我是Python新手,我感到迷失,并继续猛冲到方法以外的所有东西。


当前回答

如果你查看unittest模块的帮助,它会告诉你一些组合,允许你从一个模块运行测试用例类,从一个测试用例类运行测试方法。

python3 -m unittest -h

[...]

Examples:
  python3 -m unittest test_module               - run tests from test_module
  python3 -m unittest module.TestClass          - run tests from module.TestClass
  python3 -m unittest module.Class.test_method  - run specified test method
```lang-none

It does not require you to define a `unittest.main()` as the default behaviour of your module.

其他回答

这就像你建议的那样-你只需要指定类名:

python testMyCase.py MyCase.testItIsHot

它可以像你猜的那样很好

python testMyCase.py MyCase.testItIsHot

还有另一种方法来测试testtishot:

    suite = unittest.TestSuite()
    suite.addTest(MyCase("testItIsHot"))
    runner = unittest.TextTestRunner()
    runner.run(suite)

如果你组织你的测试用例,也就是说,像实际代码一样遵循相同的组织,并且对相同包中的模块使用相对导入,你也可以使用以下命令格式:

python -m unittest mypkg.tests.test_module.TestClass.test_method

# In your case, this would be:
python -m unittest testMyCase.MyCase.testItIsHot

Python 3文档:命令行接口

对我有用的是:

cd project_dir
python -m unittest -v path\to\test\testMyCase.py -k my_test_name

-v用于unittest详细日志输出。

如果你查看unittest模块的帮助,它会告诉你一些组合,允许你从一个模块运行测试用例类,从一个测试用例类运行测试方法。

python3 -m unittest -h

[...]

Examples:
  python3 -m unittest test_module               - run tests from test_module
  python3 -m unittest module.TestClass          - run tests from module.TestClass
  python3 -m unittest module.Class.test_method  - run specified test method
```lang-none

It does not require you to define a `unittest.main()` as the default behaviour of your module.