如何将要测试的 class 传递给单元测试 class

how to pass a class to be tested to an unit test class

我有一个class,我需要测试一下

class ToBeTested():
    def my_method():
        pass

我在 python 中设计了一些单元测试。

import unittest
class MyFirstUnitTest(unittest.TestCase):

    def setUp(self):

        # prepare some data
        # run a method
        # collect results

    def test_one_assumption_about_results(self):
      #self.assertEqual(...)

    def test_another_assumption_about_results(self):
      #self.assertEqual(...)

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

我是根据示例设计这段代码的。 现在我不明白如何将测试 class MyFirstUnitTest 与要测试的 classe 连接起来 ToBeTested?

通过继承?

  class MyFirstUnitTest(unittest.TestCase,ToBeTested):
       ######

通过创建 class ToBeTested 的对象作为 ToBeTested 的静态成员 MyFirstUnitTest class定义?

class MyFirstUnitTest(unittest.TestCase):
    mytestobj=ToBeTested()
    def setUp(self):

通过在每个测试中创建一个 class ToBeTested 的对象 MyFirstUnitTest class 定义的案例?

 class MyFirstUnitTest(unittest.TestCase):

    def setUp(self):
    ### 
    def test_one():
        mytestobj=ToBeTested()
    def test_two():
        mytestobj=ToBeTested()

请提出备选方案以及您偏爱其中任何一个的原因

如果不需要重新实例化,您可以在设置中创建 class(es) 的实例。
如果您必须在每个测试中创建一个新实例,那么只需在每个测试中创建一个新实例。

使用继承和静态成员而不是为每个测试创建一个新对象有一个缺点:如果测试改变了对象的状态,那么测试会相互影响并产生副作用。如果测试方法调用的顺序得不到保证并发生变化(例如,您重命名一个测试,突然另一个测试用例失败 - 这些事情以前发生过!),情况会变得更糟!)

此外,让您的测试用例继承自 SUT(被测对象)意味着您只能测试一个构造函数。

我认为从 SUT 继承测试用例没有任何优势,尤其是在没有私有成员的 python 中。如果由于某种原因测试需要继承(有时是这种情况),那么最好的做法是拥有一个单独的 TestAdapter class 继承并由测试实例化。

还有其他有更深入答案的问题:

https://softwareengineering.stackexchange.com/questions/366425/making-a-test-fixture-inherit-from-the-sut-class

https://softwareengineering.stackexchange.com/questions/154144/how-to-define-implementation-details