Python单元测试在所有测试之后运行函数。
Python单元测试在所有测试之后运行函数。
我需要通过ssh在python上测试一些东西。我不想为每个测试建立ssh连接,因为太麻烦了,我已经写了这个:\n
class TestCase(unittest.TestCase): client = None def setUp(self): if not hasattr(self.__class__, 'client') or self.__class__.client is None: self.__class__.client = paramiko.SSHClient() self.__class__.client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) self.__class__.client.connect(hostname=consts.get_host(), port=consts.get_port(), username=consts.get_user(), password=consts.get_password()) def test_a(self): pass def test_b(self): pass def test_c(self): pass def disconnect(self): self.__class__.client.close()
\n和我的执行器\n
if __name__ == '__main__': suite = unittest.TestSuite(( unittest.makeSuite(TestCase), )) result = unittest.TextTestRunner().run(suite) TestCase.disconnect() sys.exit(not result.wasSuccessful())
\n在这个版本中,我得到了错误`TypeError: unbound method disconnect() must be called with TestCase instance as first argument (got nothing instead)`。那么我如何在所有测试通过后调用disconnect函数呢?\n敬上。
Python中的单元测试是一种用于测试代码功能的方法。在执行单元测试时,有时候我们希望在执行所有测试之后再执行一些额外的操作。然而,Python中的unittest框架默认情况下会在执行完所有测试后自动退出,这就导致我们无法在测试结束后执行额外的操作。
为了解决这个问题,我们可以使用一个简单的解决方案。我们可以创建一个名为tmain的函数,并在其中调用setup()函数进行一些准备工作,然后调用unittest.main()函数来执行所有的测试,并通过参数exit=False来告诉unittest不要在执行完测试后退出。最后,我们再调用clean()函数来执行一些清理工作。
下面是一个示例代码:
def tmain(): setup() unittest.main(verbosity=1, exit=False) clean()
在这个示例代码中,setup()和clean()函数可以根据实际需求来定义,它们可以执行一些准备工作和清理工作。
通过这种方式,我们可以确保unittest框架不会在执行完所有测试后自动退出,而是继续执行tmain函数中的后续操作。
这样,我们就可以在单元测试执行完毕后,继续执行一些额外的操作,从而满足我们的需求。
问题:Python单元测试在所有测试之后运行函数的原因是什么?如何解决这个问题?
在Python中进行单元测试时,有时候我们希望在所有测试完成之后执行一些函数。然而,默认情况下,Python的unittest模块并没有提供直接的方法来实现这个需求。本文将介绍问题的原因以及解决方法。
问题的原因是,Python的unittest模块中的setUpClass和tearDownClass方法是针对每个测试类(每个测试文件)运行的。如果有多个测试文件,这些方法将会为每个文件运行一次。因此,如果我们希望在所有测试完成后运行某个函数,就需要寻找其他的解决方法。
解决方法如下:
首先,在tests/__init__.py文件中添加以下代码。这段代码将会在所有测试之前只运行一次,不论有多少个测试类或测试文件。
def startTestRun(self): """ https://docs.python.org/3/library/unittest.html#unittest.TestResult.startTestRun Called once before any tests are executed. :return: """ DockerCompose().start() setattr(unittest.TestResult, 'startTestRun', startTestRun) def stopTestRun(self): """ https://docs.python.org/3/library/unittest.html#unittest.TestResult.stopTestRun Called once after all tests are executed. :return: """ DockerCompose().compose.stop() setattr(unittest.TestResult, 'stopTestRun', stopTestRun)
这段代码中,我们定义了startTestRun和stopTestRun两个函数,并将其通过setattr方法添加到unittest.TestResult类中。startTestRun函数在所有测试之前运行一次,stopTestRun函数在所有测试完成后运行一次。
通过上述的解决方法,我们可以实现在Python单元测试中,在所有测试完成后运行特定函数的需求。
以上是关于问题的出现原因以及解决方法的讲解。希望对大家有所帮助!
问题:Python单元测试在所有测试之后运行函数的原因是什么?如何解决?
在Python中,当我们编写单元测试时,有时我们希望在所有测试之后运行一个函数。然而,如果我们直接在测试函数之后调用这个函数,它可能会在测试执行期间被提前调用,导致错误。
解决这个问题的方法是使用setUpClass和tearDownClass方法。setUpClass方法在所有测试开始之前执行一次,用于建立连接或其他初始化操作。tearDownClass方法在所有测试结束之后执行一次,用于清理和断开连接等操作。
另外,我们还需要将disconnect方法设置为静态方法,这样它将属于类而不是类的实例。这样做是为了确保disconnect方法可以在tearDownClass中正确调用。
下面是解决方法的示例代码:
import unittest class TestCase(unittest.TestCase): @classmethod def setUpClass(cls): cls.connection =@staticmethod def disconnect(): ... # disconnect TestCase.connection @classmethod def tearDownClass(cls): cls.disconnect()
需要注意的是,如果在Python 3中使用这种方法,需要在类函数上添加一个装饰器(decorator)。
通过使用setUpClass和tearDownClass方法,我们可以确保在所有测试执行之后运行指定的函数,从而更好地管理测试过程中的资源。这样可以提高测试的可靠性和可维护性。