Pytest使用fixture实现token共享的方法
作者:测试界媛姐
同学们在做pytest接口自动化时,会遇到一个场景就是不同的测试用例需要有一个登录的前置步骤,登录完成后会获取到token,用于之后的代码中。首先我先演示一个常规的做法。
首先在conftest定义一个login的方法,方法返回token
@pytest.fixture(scope="function") def login(): header = { "Content-Type": "application/json" } data = { "username": "test", "password": "test" } login_info = requests.post(url='http://.../login',json=data).json() return login_info['token']
在测试用例方法中引入这个方法,所有用到token,都需要使用login这个方法。
def test_user(login): token = login # 通过login获取token ...... def test_address(login): token = login # 通过login获取token ......
通过上面的方法,可以解决接口使用token的需求,不过这么做每次都会先执行login接口,有没有一种方法可以只执行一次login接口,后面的接口就不调用login接口了呢。经过老武测试,其实是可以做到的。
思路:login接口使用缓存,当有token的时候就使用token,就不调用login接口了,如果没有则调用login接口,再把token缓存起来。
那需要对上面login的方法进行改造,增加save_token方法,将token存起来。引入pickle模块,用来写数据。
import pickle @pytest.fixture(scope="function") def login(): ...... # 增加缓存方法 save_token(login_info['token']) return login_info['token'] def save_token(token): # login_path为目录中一个存放token的文件路径,自己定义。 with open(login_path, 'wb') as f: pickle.dump(login_info, f) f.close()
上面代码完成了token的写入,当没有token的时候token写入到文件中。如果有token,我们就不需要执行登录操作,直接使用文件中的token,这个时候代码需要继续改造。方法开始时判断当前是否存在保存token的文件,如果有则获取token,不再执行登录的操作。再增加一个读取文件内容的方法get_login_info
import pickle @pytest.fixture(scope="function") def login(): if os.path.exists(login_info): return get_login_info(login_info) else: ...... # 增加缓存方法 save_token(login_info['token']) return login_info['token'] # 增加一个读取文件的方法 def get_login_info(): with open(login_path, 'rb') as f: data = pickle.load(f) f.close() return data
以上工作已经完成了90%,再来个收尾就完美了。每次执行用例结束后把存token文件删除,不然生成了一个token,代码判断token文件存在,就不会去调用登录接口。token一但过期,用例就会执行失败。
在conftest定义一个方法,每次执行用例都清理一下token文件。要注意级别是session级别哦。
@pytest.fixture(scope='session', autouse=True) def clear_login_file(): if os.path.exists(login_path): logger.info("清理token文件") os.remove(login_path)
到此这篇关于Pytest使用fixture实现token共享的文章就介绍到这了,更多相关Pytest使用fixture内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!