Skip to content
📔 阅读量:

创建一条完整的用例

以域管服务端平台创建子管理员为例

封装用例步骤的方法

所有的方法都在 api 目录下;

方法基类 _base_api.py::BaseAPI 里面定义登陆接口,获取管理员登陆 WEB 平台 cookietoken 信息。

python
# _base_api.py

from apps.autotest_udcp.config import config
from urllib3.exceptions import InsecureRequestWarning
import hashlib
import requests

class BaseApi():
    SPUR_ADMIN = config.UDCP_USERNAME
    SPUR_ADMIN_PASSWORD = config.UDCP_PASSWORD
    
    def __init__(self, name=SPUR_ADMIN, password=SPUR_ADMIN_PASSWORD):
        self.login_url = config.LOGIN_URL
        self.host = self.login_url.split("/")[2]
        self.server_domain = "https://" + self.host
        self.login_by_api(name=name, password=password)

    def login_by_api(self, name=SPUR_ADMIN, password=SPUR_ADMIN_PASSWORD):
        requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
        login_url = f'{self.server_domain}/api/login'
        password = hashlib.sha512(password.encode()).hexdigest()
        data = {"username": name, "password": password}
        headers = self.get_base_headers(headers={})
        try:
            ret = requests.post(login_url, headers=headers, json=data, verify=False)
            headersp = ret.headers['set-cookie'].split(';')
            self.cookie0 = headersp[0]
            self.csrf_token_tmp = ret.headers['set-cookie'].split(" Path=/")
            str2 = self.csrf_token_tmp[1].strip((';'))
            self.csrf_token = str2.split("=")[-1]
            self.cookie = self.cookie0 + ";" + "XSRF-TOKEN=" + self.csrf_token
            return True
        except:
            return False

    def get_cookie_token(self):
        header = {'Cookie': self.cookie, 'X-XSRF-TOKEN': self.csrf_token}
        get_headers = self.get_base_headers(header)
        return get_headers

    def get_base_headers(self,headers):
        base_headers = {
            'Accept': 'application/json, text/plain, */*',
            'Accept-Encoding': 'gzip,deflate',
            'Accept-Language': 'zh-CN,zh;q=0.9',
            'Connection': 'keep-alive',
            "Content-Type": "application/json",
            "Origin": self.server_domain,
            'Host': self.host,
            'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36'
        }
        if headers != {}:
            for k, v in headers.items():
                base_headers[k] = v
        return base_headers

平台默认登陆账号是超级管理员及密码 SPUR_ADMINSPUR_ADMIN_PASSWORD;也可传入子管理账号及密码调用接口操作。

方法主文件:admin_api.py,接口业务层,根据业务需求封装接口业务方法。

python
# admin_api.py

import json
import requests
import hashlib
from apps.autotest_udcp.api._base_api import BaseApi

class AdminApi(BaseApi):
    """管理员api"""

        def create_admin_by_adminapi(
            self, 
            username, 
            fullname, 
            password='1111',
            roleids=[1],   
            department_select_tree="[{\"key\":1,\"check_status\":1}]",
            admin_group_id=1,
            phone=None, 
            email=None, 
            remark=None, 
            photo=None, 
            admin_group_ids=None
        ):
        '''
        创建平台子管理员
        @param username: 管理员账号
        @param fullname: 管理员姓名
        @param password: 密码
        @param roleids: list类型-关联角色id,角色权限
        @param department_select_tree: 数据权限,管理部门范围
        @param admin_group_id: 所属管理员分组id
        @param phone:管理员手机号
        @param email:管理员邮箱
        @param remark:备注信息
        @param photo:管理员照片
        @param admin_group_ids:管理权限管理员分组数组id
        '''
        password = hashlib.sha512(password.encode()).hexdigest()
        url = f'{self.server_domain}/uim/v4/admin/admin'
        headers = self.get_cookie_token()
        data = {
            "username": username,
            "full_name": fullname,
            "password": password,
            "role_ids": roleids,
            "phone": phone,
            "photo": photo,
            "email": email,
            "department_select_tree": department_select_tree,
            "remark": remark,
            "admin_group_id": admin_group_id,
            "admin_group_ids": admin_group_ids,
        }
        ret = requests.post(url, headers=headers, json=data, verify=False)
        status = ret.status_code
        content = json.loads(ret.content)
        return status, content

编写用例

用例基类 base_case.py::BaseCase

python
# base_case.py

from apps.autotest_my_app.my_app_assert import MyAppAssert


class BaseCase(MyAppAssert):
    """用例基类"""

所有的用例都在 case 目录下,用例文件以 test_ 开头,用例 ID 结尾:test_mycase_004.py

python
# test_mycase_004.py

from apps.autotest_udcp.case import BaseCase
from apps.autotest_udcp.server.udcp_api import UdcpApi


class TestUdcpApi(BaseCase):
    def test_udcp_api_001(self):
        """【接口测试-管理员】创建管理员成功"""
        # 1
        # 接口请求创建管理员
        # 接口请求成功
        self.api = UdcpApi()
        self.name = UdcpApi.generate_random_string()
        self.pwd = UdcpApi.generate_random_string()
        status, content = self.api.create_admin_by_adminapi(
            username=self.name, 
            fullname=self.name,
            password=self.pwd
        )
        self.assert_api_response(
            actual_status=status,
            actual_content=content,
            expect_status=200,
            expect_code=0,expect_msg='请求成功'
        )

    def teardown_method(self):
        self.api.delete_admin_by_admin_api([self.name])

这样就完成了一个简单的 HTTP 用例编写。