Skip to content
On this page

认证器

BaseAuth 类提供自定义认证管理器,定义一个类继承至该类即可。

python
class BaseAuth:
    """
    所有认证器都需要基础这个类
    """

    def authenticate(self,):
        """
        进行重写该方法来实现认证
        """
        raise NotImplementedError(".authenticate() must be overridden.")

    def authenticate_header(self,):
        """
        """
        pass

自定义认证器

在自动化过程中难免需要有登录依赖隐藏,sveltest提供认证器是为了能够解决登录接口的依赖提供的API,只要定义了认证器在后续的请求中sveltest会自动给你在每次请求时携带用户凭证相关的headers。那么定义一个认证器也比较简单如下操作即可:

  1. 自定义一个认证器类,基础至BaseAuth
python
class UserAuth(BaseAuth):
    pass
  1. 重写authenticate方法,该方法一般都是实现向登录接口发起请求从而获取登录后的凭证(token等)
python
class UserAuth(BaseAuth):
    
    def authenticate(self):
    """必须重新该 authenticate方法"""

那么我这里有个登录接口,我就已这个接口为例:

img

登录后的结果

img

python
class UserAuth(BaseAuth):

    def authenticate(self):
        """必须重新该 authenticate方法"""
        ret = RequestBase()
        response_ = ret.post(router="http://127.0.0.1:8666/api/v1/login",
                             data={
                              "username": "13453001",
                              "password": "123456"
                            },
                             env_control=False)

        print(response_.json)

img

  1. 处理返回值

每一个认证器定义后重新authenticate方法必须有返回值且返回值必须遵循如下:

  • 必须要以字典类型传出
  • 字典必须包含一个带有用户权证相关的内容如:token相关字段具体根据自己的项目的key来命名,我这里可以看到是token字段就是认证凭证因此需要如下处理:
python
class UserAuth(BaseAuth):

    def authenticate(self):
        """必须重新该 authenticate方法"""
        ret = RequestBase()
        response_ = ret.post(router="http://127.0.0.1:8666/api/v1/login",
                             data={
                              "username": "13453001",
                              "password": "123456"
                            },
                             env_control=False)

        # 直接将整个返回值返回,但不建议怎么做
        # return response_.json
        return {"token":response_.json["token"]}

如果你不遵循如上规则那么你可能会出现意想不到的异常情况。

  1. 注册认证器

编写好了认证器后则需要在您的工程目录下的settings.py文件中配置认证器,并让sveltest能够注册它。在VALIDATORS中注册好自定义的控制器,需要按照Python导入模块一样如下格式:

components.network.auth则是如:包.模块.类

必须定位到class级否则会出异常,这是因为sveltest采用的是动态导入/加载相关定义的类或者说是控制器(组件等)

img

python
# 框架控制器
VALIDATORS = ["components.network.auth.UserAuth"]
  1. 以上都配置完成后,即可正常使用认证器,之后的每次使用TestCase类定义方法时则会首次加载认证器一次后则之后的每次用例中都会自动携带上我们认证器返回的字段加入到请求headers中。
python
import os

# 在debug模式下需要将该行代码放与模块os模块下,非debug则无影响,测试通过后需要删除搞段代码,这样做是为了sveltest能去找到认证器

os.environ.setdefault('SVELTEST_TEST_SETTINGS_MODULE', 'slt.settings')

from sveltest.case import TestCase, HttpTestCase
from sveltest import main


class SveltTestCase(HttpTestCase):

    def setUp(self):
        print("用例执行前")

    def tearDown(self):
        print("用例执行后")


    def test_case(self):
        """第一测试用例demo"""
        cd = self.get(router="http://127.0.0.1:8666/api/v1/index", env_control=False)
        print(cd.request_headers)
        self.assertEqual(1,2)


if __name__ == '__main__':
    main(debug=True,verbosity=3,toast=False)

可以看到我们根本没有传入任何的headers则在查看请求headers时发现出现这么多headers信息,这是因为sveltest的http模块是自带相关默认的headers信息的而token段内容则是我们自定义的认证器所返回的内容

img

其他相关配置

python
# 认证控制器相关配置
AUTH_VALIDATORS = {
    "CLASS":"BaseAuth",# class
    'ACCESS_TOKEN_LIFETIME': timedelta(seconds=180),  # 配置过期时间
}