Python单元测试在所有测试之后运行函数。

9 浏览
0 Comments

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敬上。

0
0 Comments

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函数中的后续操作。

这样,我们就可以在单元测试执行完毕后,继续执行一些额外的操作,从而满足我们的需求。

0
0 Comments

问题: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单元测试中,在所有测试完成后运行特定函数的需求。

以上是关于问题的出现原因以及解决方法的讲解。希望对大家有所帮助!

0
0 Comments

问题: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方法,我们可以确保在所有测试执行之后运行指定的函数,从而更好地管理测试过程中的资源。这样可以提高测试的可靠性和可维护性。

0