一、前言
在自动化测试中,我们经常遇到一些问题:
(1)测试用例成百上千,登录状态是如何保持的?
(2)每个被测接口,都依赖于其他接口的传参,如下图,前置接口类有十几个,另外,还有一些常用的库,例如datetime, json, requests, os 等,难道每个测试用例类都要写十几个from XXX import XXX 么?
那么,怎么样能简化接口导入的写法,一次将所有依赖和库都 import 呢?
二、解决问题
1、解决token共享问题效果,如下图
/api/auth/jwt/token 为登录接口,仅登录一次,执行了全部接口测试用例
2、简化 import
在【python+unittest 接口自动化测试实战 (五) 】-- 设计测试用例 一文中,我们有一步操作是导入前置接口。
如下图,只需要 from PreProcessing import * 就可以一次导入前文中的十几个前置接口了
三、实现
接下来我们将利用 python 包的一些特性,实现token共享,并简化接口导入。
首先,我们要了解python包到底有什么特性
(1)__init__.py在导入时,如果有可运行的代码,会执行代码
(2)import 只会导入一次,即,不管 import 多少次,实际只会运行一次
所以,我们只需要创建一个前置方法的包,例如 PreProcessing包,将需要用的方法都封装到该包中,然后在__init__.py中
1、将需要导入的方法全部导入
# coding=UTF-8 __all__ = [ 'CoreBaseCore', 'CoreCore', 'CoreDept', 'CoreSet', 'CoreUser', 'LisApplication', 'RtidLisSetProjectMapping', 'RtipLisAntibiotic', 'RtipLisMidClinicalApply', 'RtipLisOut', 'RtipLisQueuingWindows', 'RtipLisReport', 'RtipLisReportCheckCondition', 'RtipLisReportProject', 'RtipLisReportUnit', 'RtipLisUnitProjectMapping' ]
import requests import unittest import json from random import choice import datetime import random import string import pymysql import os import time
2、实现登录方法获取到token
admin_params = {'username': '***', 'password': '***'} base_url = 'http://***'
def get_token(params): """ 登录 """ login_url = base_url + '/api/auth/jwt/token' login_headers = { # 'Content-Length': '39', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.157 Safari/537.36', 'Content-Type': 'application/json;charset=UTF-8', 'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Accept-Language': 'zh-CN,zh;q=0.9' } try: r = requests.post(url=login_url, json=params, headers=login_headers) response = json.loads(r.text) req_token = response['data']['token'] return req_token except KeyError: print('Get Token Failed') req_token = get_token(params)
3、另外,还可以定义些常用参数
LEVEL = 'debug' # 日志级别 PTYPE = (1, 2) # 类型 SEX_CODE = (1, 2, 3, 4) # 性别 AGE_UNIT_CODE = ('day', 'month', 'year') # 年龄单位 USE_FLAG = (1, 0) # 启用标志 PRINT_NOW = (0, 1) # 现打条码 BUSINESS_TYPE = (1, 2, 3, 4, 5, 6, 7) # 报告项目业务类型 1通用
最后,在所有测试类中,以上 __init__.py 中声明的内容都可以使用了
# coding=utf-8 import sys sys.path.append('..') import PreProcessing as p from PreProcessing import * class Accept(p.unittest.TestCase): @classmethod def setUpClass(cls): cls.header, cls.org_id, cls.user_id = p.header, p.org_id, p.user_id print('header:', cls.header) cls.url_test = p.base_url + '/api/rtip/lis/application/accept' def setUp(self): t = LisApplication.LisApplication(p.base_url, self.__class__.org_id, self.__class__.header) self.app_detail = t.get_app_detail('1') print('app_detail', self.app_detail) self.app_detail['applicationStatus'] = '2' # 将申请状态更新为2接受 c = CoreBaseCore.CoreBaseCore(p.base_url, self.__class__.org_id, self.__class__.header) self.doctor_id = c.get_core_technician() print('doctor_id', self.doctor_id) def test_accept_sample_001(self): pass def tearDown(self): pass @classmethod def tearDownClass(cls): pass if __name__ == '__main__': p.unittest.main()