请教个 py.test 的使用问题( case 间参数依赖)

2016-12-24 21:29:02 +08:00
 iyaozhen

大概的代码是这样:

import requests
import pytest

class TestRestApi():
    url = 'http://xxx.com'

    @pytest.fixture(scope="session")
    def http_session(self):
        # 省略设置 cookie 等步骤,返回一个 request.session 对象
        return requests.Session()

    def test_api_a(self, http_session):
        response = http_session.post(self.url + '/app/sessioncontextget', json=body)
        assert response.status_code == 200
        data = response.json()
        # 我想保存此 api 的一个返回值
        self.session_id = data['data']['session_id']
        assert data['code'] == 200

    def test_api_b(self, http_session):
        body = {
            # 请求参数依赖前一个 api 的返回值
            "sessionid": self.session_id,
        }
        response = http_session.post(self.url_ge + '/api/taskcreate', json=body)
        assert response.status_code == 200
        data = response.json()
        assert data['errcode'] == 0

断点调试发现 session_id 是设置成功了的, test_api_a 也测试通过

但运行到 test_api_b 时却提示:AttributeError: 'TestRestApi' object has no attribute 'session_id'。不过这也很好理解,单测本来就是每个 case 独立的,每次相当于都是重新运行。

那么问题来了,这个需求怎么解决?

还有一个问题, pytest.fixture 的特性感觉不是很方便, http_session 变量无法被 IDE 识别,没有代码提示了(不过这个影响很小),关键是每个测试 case 都要传入 http_session 参数,感觉不够简洁。

初次使用 py.test ,可能理解不是很透彻,还请见谅。

5917 次点击
所在节点    pytest
2 条回复
jerry14
2016-12-24 22:15:56 +08:00
1. 既然有个 case 需要两步,有个依赖,那就放到一起。之前的那个 case 不变
2. 你可以在 setup 方法里初始化 http_session ,然后作为一个实例属性
iyaozhen
2016-12-24 22:33:40 +08:00
@jerry14 非常感谢。
1. 你说的这个方法也行。但是不符合我的其它需求,我需要最终出一个报告,所以需要每个 api 在单独的 test case 中。
2. 嗯,这样可以。现在这样做了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/329934

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX