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

一个“框架”类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新手,我感到迷失,并继续猛冲到方法以外的所有东西。


当前回答

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

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

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

Python 3文档:命令行接口

其他回答

TL;DR:这很可能会起作用:

python mypkg/tests/test_module.py MyCase.testItIsHot

解释:

方便的方式 python myypkg /tests/test_module.py mycase . testtishot 会起作用,但是不言而喻的假设是您已经在您的测试文件中(通常在末尾)有这个常规的代码片段。 如果__name__ == "__main__": unittest.main () 不方便的方式 python -m unittest mypkg.tests.test_module.TestClass.test_method 总是可以工作,不需要你有if __name__ == "__main__": unittest.main()代码片段在你的测试源文件。

那么为什么第二种方法被认为不方便呢?因为这将是一个痛苦的<插入您的一个身体部位这里>键入长,点分隔的路径。而在第一种方法中,mypkg/tests/test_module.py部分可以由现代shell或您的编辑器自动完成。

对我有用的是:

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

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

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

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

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

Python 3文档:命令行接口

如果你想直接从脚本(例如,从jupyter笔记本)运行测试,你可以这样做,只运行一个测试:

from testMyCase import MyCase
unittest.main(argv=['ignored', '-v', 'MyCase.testItIsHot'], exit=False)

它可以像你猜的那样很好

python testMyCase.py MyCase.testItIsHot

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

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