Python 请问该如何处理测试用例间多值传输问题

今晚打老虎 · 2024年01月30日 · 最后由 今晚打老虎 回复于 2024年01月31日 · 3992 次阅读

代码如下,需要 A 执行后将响应值传入 courseClassify_list,然后将其参数化给 test_B
问题:@data在初始化时就会取值,而非等到 test_A 执行后,初始化为 [] 也导致 test_B 未执行
注:忽略文件中转方式

import unittest
from ddt import ddt, data
type = [1,2]
@ddt
class MyTestCase(unittest.TestCase):
    courseClassify_list = []    #最终为[('data3', 'data4'),('data3', 'data4')]的状态
    @data(*type)
    def test_A(self,data):
        # 执行A测试用例并向courseClassify_list插入数据
        self.courseClassify_list.append(('data3', 'data4'))  #共2条用例,都会生成一份('data3', 'data4')
        print(self.courseClassify_list)  # 验证是否成功插入数据
    @data(*courseClassify_list)
    def test_B(self, data):
        # 使用courseClassify_list作为数据驱动执行B测试用例
        print(data)  # 打印每个数据
if __name__ == '__main__':
    unittest.main()

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
最佳回复

虽然我不知道你的实际场景是怎么样的,但是如果是把 A 的结果当做 B 的数据源是可以实现的。刚刚的代码是有点问题,重新修改了一下,只需要在 courseClassify_list 初始化的时候,占位元素改为可变数据类型就可以了,然后根据你的类型来调用

from ddt import ddt, data

type = [1, 2]


@ddt
class MyTestCase(unittest.TestCase):
    courseClassify_list = [[] for _ in range(len(type))]  # 最终为[ [('data3', 'data4')],[('data3', 'data4')] ]的状态

    @data(*type)
    def test_A(self, data):
        # 执行A测试用例并向courseClassify_list插入数据
        self.courseClassify_list[type.index(data)].append(('data3', 'data4')) # 共2条用例,都会生成一份('data3', 'data4')
        print(self.courseClassify_list)  # 验证是否成功插入数据

    @data(*courseClassify_list)
    def test_B(self, data):
        # 使用courseClassify_list作为数据驱动执行B测试用例
        # 注意不是data,是data[0]
        print(data[0])  # 打印每个数据


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

输出结果:

Ran 4 tests in 0.000s

OK
[[('data3', 'data4')], []]
[[('data3', 'data4')], [('data3', 'data4')]]
('data3', 'data4')
('data3', 'data4')
共收到 11 条回复 时间 点赞

各位大佬帮帮忙回复下啊,GPT 都废了

我现在都是每个用例独立的,确实有用到前置接口返回值得,我用 fixture 在写一下。

七街老酒 回复

我这里面确实堆积的太多了,只是刚好碰到这个场景,就想弄清楚能不能解决

在脚本中用 setUp() 去执行 A 的部分,拿到数据后存起来,再去给 B 用,可行吗

何必搞这么复杂呢?这样不行吗? 数据驱动就在最外面驱动好了

import unittest
from ddt import ddt, data
type = [1,2]
@ddt
class MyTestCase(unittest.TestCase):
    courseClassify_list = []    #最终为[('data3', 'data4'),('data3', 'data4')]的状态
    @data(*type)
    def test_A(self,data):
        # 执行A测试用例并向courseClassify_list插入数据
        self.courseClassify_list.append(('data3', 'data4'))  #共2条用例,都会生成一份('data3', 'data4')
        print(self.courseClassify_list)  # 验证是否成功插入数据
        for item in self.courseClassify_list:
            print(item)

if __name__ == '__main__':
    unittest.main()
仙道彰 回复

可行,但是 A 本身又需要参数化获取两个场景的结果值,在 setup 内应该没办法进行参数化吧,这个到没试过

simonpatrick 回复

没太懂,这部分只是前置场景,核心点是 test_A 执行后的 courseClassify_list 怎么传给 test_B 进行参数化

如果能保证 courseClassify_list 的长度和 type 的长度是一样的话,那你在定义 courseClassify_list 的时候先预设长度,在 test_A 执行的时候替换掉就可以了

import unittest
from ddt import ddt, data
type = [1,2]
@ddt
class MyTestCase(unittest.TestCase):
    courseClassify_list = [_ for _ in range(len(type))]    #最终为[('data3', 'data4'),('data3', 'data4')]的状态
    @data(*type)
    def test_A(self,data):
        # 执行A测试用例并向courseClassify_list插入数据
        self.courseClassify_list[type.index(data)] = ('data3', 'data4')  #共2条用例,都会生成一份('data3', 'data4')
        print(self.courseClassify_list)  # 验证是否成功插入数据
    @data(*courseClassify_list)
    def test_B(self, data):
        # 使用courseClassify_list作为数据驱动执行B测试用例
        print(data)  # 打印每个数据
if __name__ == '__main__':
    unittest.main()
去踢球吧 回复

重点不是中转值的存储,而是装饰器在类初始化时便会去取值,而后才会进行具体 case 的执行。至少现在来看通过装饰器进行 A 输出值的参数化是不可行的

虽然我不知道你的实际场景是怎么样的,但是如果是把 A 的结果当做 B 的数据源是可以实现的。刚刚的代码是有点问题,重新修改了一下,只需要在 courseClassify_list 初始化的时候,占位元素改为可变数据类型就可以了,然后根据你的类型来调用

from ddt import ddt, data

type = [1, 2]


@ddt
class MyTestCase(unittest.TestCase):
    courseClassify_list = [[] for _ in range(len(type))]  # 最终为[ [('data3', 'data4')],[('data3', 'data4')] ]的状态

    @data(*type)
    def test_A(self, data):
        # 执行A测试用例并向courseClassify_list插入数据
        self.courseClassify_list[type.index(data)].append(('data3', 'data4')) # 共2条用例,都会生成一份('data3', 'data4')
        print(self.courseClassify_list)  # 验证是否成功插入数据

    @data(*courseClassify_list)
    def test_B(self, data):
        # 使用courseClassify_list作为数据驱动执行B测试用例
        # 注意不是data,是data[0]
        print(data[0])  # 打印每个数据


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

输出结果:

Ran 4 tests in 0.000s

OK
[[('data3', 'data4')], []]
[[('data3', 'data4')], [('data3', 'data4')]]
('data3', 'data4')
('data3', 'data4')
11楼 已删除
今晚打老虎 关闭了讨论 01月31日 11:19
今晚打老虎 重新开启了讨论 01月31日 11:19
去踢球吧 回复

已解决,感谢大佬!

今晚打老虎 关闭了讨论 02月01日 08:25
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册