【问题标题】:when to create python requests session object何时创建 python 请求会话对象
【发布时间】:2017-07-16 11:34:55
【问题描述】:

我使用python requests 和机器人框架来制作我的自动化测试用例,我有一个类使用 requests lib 创建很多测试方法,例如登录,注销等,这些方法用作关键字测试用例,现在我很困惑在哪里初始化requests.Session(),因为测试用例在两种解决方案中都通过了,如下所示:

方案一:在类的init方法中初始化requests.Session()

import requests

class MyHttpBase():
    def __init__(self):
        self.s = requests.Session()

    def login(self, login_user, password):
        data = {'username': login_user, 'password': password}
        return self.s.post('http://example.com/login', data=data)

    def logout(self):
        resp = self.s.get('http://example.com/logout')
        return resp

方案二:在类的登录方法中初始化requests.Session()

import requests

class MyHttpBase():
    def __init__(self):
        self.s = None

    def login(self, login_user, password):
        self.s = requests.Session()
        data = {'username': login_user, 'password': password}
        return self.s.post('http://example.com/login', data=data)

    def logout(self):
        resp = self.s.get('http://example.com/logout')
        self.s.close()
        return resp

我只是想确保一个登录用户在测试执行期间只有一个会话,但是在我的一些测试用例中,测试步骤包括多用户登录步骤,例如:

测试用例示例:

  • 第 1 步:用户 A 登录并执行操作然后注销
  • 第 2 步:用户 B 登录并执行操作然后注销
  • ...

如果我将 requests.session 放入类的 init 方法中,用户 A 和用户 B 拥有相同的会话对象。 如果我把requests.session放到login方法中,在类的init方法中requests.session设置为None,这样就不好了。

还有其他解决方案或建议吗?

【问题讨论】:

  • 您能否阅读 StackOverflow 指南以创建 minimal, complete and verifiable example 并增强您的问题?在目前的状态下,它太模糊了,不会为您提供您正在寻找的答案。
  • 对不起,我已经编辑了这个问题,希望这足够清楚

标签: python python-requests robotframework


【解决方案1】:

在解决方案 1 中:

由于 session 对象在 __init__ 方法中,所以当您实例化 MyHttpdatabase 对象时会创建会话对象。变量“s”的类型是 requests.session

解决方案2:

由于 session 对象在 __init__ 方法中,所以 s 是 NoneType 因为没有分配给它。一旦你调用 login 方法,会话对象就会被创建并分配给 s。

一个好的做法是让你的类的实例化应该在 __init__ 方法中,以避免它是 noneType。所以解决方案 1 是正确的方法。

编辑您更新的问题:

class MyHttpBase():
    def __init__(self):
        self.s = requests.Session()

    def login(self, login_user, password):
        data = {'username': login_user, 'password': password}
        return self.s.post('http://example.com/login', data=data)

    def logout(self):
        resp = self.s.get('http://example.com/logout')
        self.s.close()
        return resp

a=MyHttpBase()
b=MyHttpBase()
a.login(user1,pass1)
b.login(user2,pass2)
a.logout()
b.logout()

a 和 b 是 MyHttpBase 类的单独实例。而 a.s 和 b.s 是单独实例的成员变量(不是所有实例都相同的静态变量)

【讨论】:

  • 有几个登录账号,如果requests.session在类init方法中,所有用户都会使用同一个会话,因为机器人框架只是加载类只有一次。
  • 是的。当您不打算进行并行执行时,为什么要创建同一类的多个实例?还要确保此答案对您的解决方案有帮助。如果没有,请更新您的问题。
  • 谢谢,我已经编辑了我的问题,请再看看。
  • 嗨,DevD,你的代码没问题,但是机器人框架只加载了一次类,​​这意味着类的init方法只执行了一次,这意味着所有登录用户将使用同一个会话测试用例包含多个不同用户登录过程的对象,所以我把requests.Session()放到了login方法中,但这不是一个好习惯。
  • 更好的主意是使用 get_session 方法返回一个会话对象并将其分配给 RF 中的变量。然后在 login 方法中添加 session 参数并使用该对象执行操作
猜你喜欢
  • 2010-10-14
  • 1970-01-01
  • 1970-01-01
  • 2023-03-28
  • 2020-03-11
  • 1970-01-01
  • 2018-08-08
  • 1970-01-01
  • 2021-10-22
相关资源
最近更新 更多