通过命令行运行unittest.TestCase中的单个测试
通过命令行运行unittest.TestCase中的单个测试
在我们的团队中,我们通常这样定义大部分的测试用例:
一个“框架”类ourtcfw.py
:
import unittest class OurTcFw(unittest.TestCase): def setUp: # 做一些操作 # 其他我们想要在各处使用的内容
以及很多像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
并且只运行testItIsHot()
。
我该如何实现这个目标?
我尝试重写if __name__ == "__main__":
部分,但由于我对Python还不熟悉,我感到迷茫,总是碰到其他方法而不是我想修改的部分。
问题的出现原因是当使用命令行运行`unittest.TestCase`中的单个测试时,需要按照特定的命令格式。如果按照实际代码的组织方式进行测试用例的组织,并且在同一个包中使用相对导入的方法导入模块,就可以使用以下命令格式:
python -m unittest mypkg.tests.test_module.TestClass.test_method # 在你的情况下,应该是: python -m unittest testMyCase.MyCase.testItIsHot
解决方法是按照上述命令格式在命令行中运行相应的测试用例。这种方式更加符合Python 3文档中的要求。
然而,这种命令格式看起来非常冗长,类似于Java的风格。“long_module_name.SameLongNameAsAClass.test_long_name_beginning_with_test_as_a_convention”,这样的命名方式可能不太符合一般的代码模块化思维,特别是当按照模块组织测试用例时。
Python 3的文档提供了关于命令行界面的详细说明,可以参考文档:Command-Line Interface。
原因:问题的原因是作者在使用unittest.TestCase通过命令行运行单个测试时,遇到了困难。
解决方法:作者提出了两种解决方法。第一种方法是直接在命令行中运行单个测试,使用的命令为python testMyCase.py MyCase.testItIsHot
。第二种方法是在代码中创建一个测试套件,然后运行该套件中的指定测试。具体代码如下:
suite = unittest.TestSuite() suite.addTest(MyCase("testItIsHot")) runner = unittest.TextTestRunner() runner.run(suite)
作者还补充了一点,如果想要运行整个TestCase类,可以省略测试套件部分,直接使用runner = unittest.TextTestRunner()
,然后跟上runner.run(unittest.makeSuite(MyCase))
。
这样,作者解决了通过命令行运行单个测试的问题,并且提供了两种不同的解决方法,方便读者选择使用哪种方法来解决类似的问题。
在使用命令行运行unittest.TestCase的单个测试时,出现了以下问题:
问题原因:指定类名和方法名时,只有方法名以"test"开头才能正常运行。如果方法名不是以"test"开头,无法使用该方法运行被禁用的测试。
解决方法:如果测试文件位于子目录中,需要在子目录中创建一个空的`__init__.py`文件,并使用`test`作为前缀来调用测试方法。
然而,有一些用户表示这种方法并不起作用,他们找到了其他解决方法。有一个用户提到了创建`__init__.py`文件,但没有提供具体的步骤和代码。另一个用户表示在尝试使用该方法时出现了错误,错误信息为"module testMyCase has no path",但没有提供解决方法。
尽管有一种方法可以通过命令行运行unittest.TestCase的单个测试,但该方法有一些限制和问题,需要根据具体情况进行调整和解决。