在Python中运行测试脚本场景

2024-09-30 16:33:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在开发一个脚本来测试另一个程序。基本上,我复制了一个类,其中包含了我正在测试的程序的所有函数。为了简单起见,假设我只有两个函数:set(value)和add(value)。set(value)设置一个累加器值,add(value)向其添加值;我正在测试一个应该执行相同操作的程序。在

我还有一个check()函数,它验证set(value)和add(value)操作的累加器值是否与我正在测试的程序检索的值相同;因此,在每次操作之后,我都要运行check()函数并确保它们匹配。在

为了说明这一点,下面是一个(未经测试)的示例:

def set(self, value):
    self.acc = value
    sendCommandToMyProgram('set', value)

def add(self, value):
    self.acc += value
    sendCommandToMyProgram('add', value)

def check(self):
    return self.acc == sendCommandToMyProgram('check', value)

我想做“测试场景”,比如:

^{pr2}$

还有很多其他人

制作这个“测试场景”脚本的最佳方法是什么?如果它可以与接受不同参数的函数一起工作,那就更好了(在本例中,set()和add()都只收到一个参数值,但情况并非总是如此)。在

谢谢


Tags: 函数self程序脚本add示例returnvalue
3条回答

每次手术后我都需要运行“check()”。在

我最终创建了“测试场景”,比如:

test_scenarios =
    [
        [
            (obj.set, {1}),
            (obj.add, {5}),
            (obj.add, {-2})
        ],
        [
            (obj.set, {-2}),
            (obj.add, {3}),
            (obj.add, {-5})
            (obj.add, {1})
        ]
    ]

然后我迭代测试场景,基本上调用test[0](**test[1]),然后check()

但我想不出最好的解决办法

假设您不想在正常操作期间检查值all,首先想到的是内置的unit test module。在

如果您需要做一些更复杂的事情,而这些事情不能像下面所示的那样干净地隔离测试,请查看我不得不解决的一些my issues。值得注意的是,我最终推出了自己的测试运行程序,它的行为与单元测试非常相似,但控制能力更强。下个月左右我会把它推到py pi。在

工作单元测试示例

import unittest

class RealAccumlator(object):
    def __init__(self):
        self.acc = 0

    def add(self, val):
        self.acc += val

    def set(self, val):
        self.acc = val

    def get(self):
        return self.acc


# Using a global variable as I dont know how "sendCommandToMyProgram"
# is used
real_acc = RealAccumlator()


# Test Script

class MyAccumlator(object):
    def __init__(self):
        self.acc = 0

    def add(self, val):
        self.acc += val
        real_acc.add(val)

    def set(self, val):
        self.acc = val
        real_acc.set(val)

    def check(self):
        return self.acc == real_acc.get()

class MockedAccumlatorTests(unittest.TestCase):

    def setUp(self):
        self.acc = MyAccumlator()

    def test_SetFunction(self):
        test_values = range(-10,10)

        # Test the set commands
        for val in test_values:
            self.acc.set(val)
            self.assertTrue(self.acc.check())

    def test_AddFunction(self):
        test_values = range(-10,10)

        # Set the acc to a known value and to a quick test
        self.acc.set(0) 
        self.assertTrue(self.acc.check())

        # Test the add commands
        for val in test_values:
            self.acc.add(val)
            self.assertTrue(self.acc.check())


class RealAccumlatorTests(unittest.TestCase):

    def test_SetFunction(self):
        test_values = range(-10,10)

        # Test the set commands
        for val in test_values:
            real_acc.set(val)
            self.assertEqual(val, real_acc.get())

    def test_AddFunction(self):
        test_values = range(-10,10)

        # Set the acc to a known value and to a quick test
        real_acc.set(0) 
        self.assertEqual(0, real_acc.get())

        # Test the add commands
        expected_value = 0
        for val in test_values:
            expected_value += val
            real_acc.add(val)
            self.assertEqual(expected_value, real_acc.get())

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

根据接受的答案更新

如果这只是一个测试脚本,并且你的模拟累加器没有在测试之外使用,那么考虑下面的mod。我仍然相信,从长远来看,编写单元测试将更好地为您服务

^{pr2}$

这将允许您迭代任何想要的列表,而不必考虑调用check函数。提供了两种方法供您检查。在

  1. 如果不匹配,assert调用将抛出异常(仅在假设这将作为测试脚本存在的情况下建议)。

  2. 删除assert并检查调用脚本的返回状态(而不是显式调用check())也可以清理问题。

设置值。创建一个包含要添加的值的列表。然后,循环该列表,在每个循环中运行check和{}。i、 e.:numlist = [1, 2, -2, 3]; for num in numlist: obj.check(); obj.add(num)

相关问题 更多 >