接口测试 想通过 @pytest.mark.parametriz 做数据驱动,但是因为参数本身是上一条用例执行后才获取的,导致直接执行时会报错数据不存在,是否有好的办法解救一下?

Xbin · October 19, 2023 · Last by 名字是个称呼 replied at October 27, 2023 · 7213 hits

简单的举个我现在的示例:


    def test_A():
        res = req.requests(url, data)
        res = res.json()
        yaml.s({'id': res['id']})  # 这里简单表示将A结果'id'数据存入yaml文件  
                                              yaml.s代表存入方法

#  这里单纯的想着直接从yaml文件中读取上一条用例获得的id数据【yaml.r代表肚读取方法】
   @ pytest.mark.parametriz(id, [yaml.r('id')])  
    def test_B(id)
        data = {'id':id}
        res = req.requests(url, data)
        res = res.json()

实际结果 pytest 执行开始就会找不到'id' ,所以想问问如果这种情况该怎么处理比较好,或者该换怎么样形式去写?

共收到 15 条回复 时间 点赞

两条用例之间应该相互独立,把 test_A 中写入数据的内容,放在 test 方法外部

有个 pytest dependency ,具体可以查一下 将 2 个 case 之间建立依赖。不知道能不能解决你的问题

基本原则是用例之间不能耦合。

如果一定要这么搞,你就只能在依赖数据的用例里,加判断去看前置数据是否准备完毕(这个判断可以是一个全局变量,可以是一条数据库标志性数据等),如果前置数据没准备完,要不阻塞,要不直接跳过不跑(但是显然都不合适)。

个人建议的做法是,把前置依赖的那块数据 mock 好,这才是正规做法;也可以让他们合并成一个用例一起跑,至于怎么合并就看你实际用例怎么写

Xbin #4 · October 20, 2023 Author
小轩 回复

两条理论上是相互独立的,只是 test_b 想用 test_a 产生的数据,但 pytest 执行时不是按照顺序执行吧,导致一开始就会找不到,我现在的做法也是将数据都存到 yaml 文件再读的

Xbin #5 · October 20, 2023 Author
下田了 回复

好的谢谢 我找找试试

Xbin #6 · October 20, 2023 Author
王稀饭 回复

明白 当然这样最好,我就想着能够获取数据来判断更加灵活,例如更换头像需要头像 id 那就想着从获取头像列表的接口数据中取得其中一个 id,已作为更换头像接口的参数,这样就可以保证头像列表无论增加还是减少、即便 id 有变化,我都能保证用例执行时不会有问题

Xbin 回复

就这个具体案例,那你可以同一个全局变量来保存这个 id 值,查了一下 pytest 有个叫 pytest-ordering 的插件可以控制用例运行先后顺序,然后在后置用例里再检查全局变量是否有值和可用,不可用报错,可用就正常跑这样。

Xbin #8 · October 20, 2023 Author
王稀饭 回复

好的 感谢 我去了解一下

pytest.fixture 应该可以实现,可以了解下

用测试类,放到类属性里,后面的用例直接拿就行

感觉下面这个帖子说的一些内容挺符合自动化的编写要求的,可以参考下
https://testerhome.com/topics/37703

Xbin #12 · October 23, 2023 Author

好 学习一下

可以将上一条用例的结果保存到一个文件里,写一个方法获取这个文件的内容,在下一个用例中使用该方法获取的数据来做参数化
例如 @pytest.mark.parametrize('info',read_yaml('./test_get_token.yaml'))

Xbin #14 · October 24, 2023 Author
晴天 回复

我现在是这样的 可能执行的时候 执行时会优先要传入 @pytest.mark.parametrize()里面的值,没有顺序一说,但是这时候 yaml 文件内还没有上一条数据存入 ,所以就报不存在了

我现在取巧处理了 不要在@pytest.mark.parametrize 传了 , 不足就时 allure 报告中就看不到传参 先慢慢实现后面再整理规范吧

应该可以把用例 A 在 conftest 执行,获取返回的 id,传给用例 B

需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up