【python+unittest 接口自动化测试实战 (六) 】-- token共享,import简化

一、前言

在自动化测试中,我们经常遇到一些问题:

(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()

猜你喜欢

转载自blog.csdn.net/kk_gods/article/details/111222393