Python自动化测试学习3

文章目录

    • 一、数据格式
        • 1. yaml的简介
        • 2. json的格式
        • 3. yaml的读取方法
    • 二、HttpRunner
        • 2.1 什么是HttpRunner
        • 2.2 HttpRunner 环境搭建与命令
        • 2.3 建立HttpRunner测试项目
          • 1. 创建一个httprunner的项目
          • 2. httprunner_api
          • 3. httprunner框架的一些参数配置
          • 4. httprunner中extract响应数据提取
          • 5. httprunner的三种参数化

一、数据格式

1. yaml的简介

yaml是一种数据格式,支持注释,通过#注释

  • 语法规则:
    区分大小写
    使用缩进判断层级关系
    # 注释
2. json的格式

map对象,又称:字典dist {name: 百里}
数组:又称:列表list [{name: 白里1},{name: 白里2},{name: 白里3} ]

  • JSON和YAML是可以相互转换的
# MAP对象
# 两种格式
泡泡: {name: "泡泡"}

可可: 
  name: "可可"
# 数组
数组1: [{name: 可可1},{name: 可可2},{name: 可可3}]

数组2:
  - name: "可可1"
  - name: "可可2"
  - name: "可可3"
3. yaml的读取方法
  1. 普通的读写方法
import yaml

class YamlUtil:
    def __init__(self,yaml_path):
        self.yaml_path = yaml_path

    # 读取 dist or list
    def read_yaml(self):
        with open(self.yaml_path,"r",encoding="utf-8") as f:
            yaml_data = yaml.load(f,Loader=yaml.FullLoader)
            return yaml_data

if __name__ == '__main__':
    res = YamlUtil('test.yaml').read_yaml()
    print(res)

# [{'name': '测试读取', 'request': {'method': 'GET', 'url': 'www.baidu.com', 'data': {'type': 'client'}}, 'validate': [{'equals': {'status': 200}}, {'contains': 'access_code'}]}]
  1. 使用ddt读取yaml
import unittest
from ddt import file_data, ddt

@ddt
class GzhCase(unittest.TestCase):
    # 这个装饰器可以读取文件
    @file_data('test.yaml')
    def test_01_get_token(self, **kwargs):
        print(kwargs)
        print(kwargs['name'])
        print(kwargs['validate'])


if __name__ == '__main__':
    unittest.main()
  • bug: 当鼠标放在方法上执行时报错
    AttributeError: type object 'GzhCase' has no attribute 'test_01_get_token'
    原因:
    加了ddt后,运行时要先识别装饰的类。若将光标放在某一个方法后面的话,测试用例只会执行当前的方法,ddt识别不到类,就会报错。
    解决:
    将光标放到外面或者通过main方法运行,就不会报错

二、HttpRunner

2.1 什么是HttpRunner
  1. HttpRunner简介
  • 它是面向http协议的测试框架,只要去维护一份yaml/json文件就可以实现自动化测试、结合locust性能测试,线上性能监控,持续集成等多种需求
    (junit,testing,unittest,pytest,httprunner,robotframework)
  • 有两个版本 2.x和3.x
  1. 设计思想和理念
  • 重复复用优秀的开源项目(不追求重复造轮子,而是将轮子组装成战车)
  • 约定大于配置(提升测试脚本的可维护性)
  • 配置文件组织测试用例(yaml/json)
  • 一次投入,多次复用
  • 高度可扩展性
    Python自动化测试学习3_第1张图片
2.2 HttpRunner 环境搭建与命令
  • 支持python2.7,推荐3.7

  • 安装httprunner (pip install httprunner,pip install har2case)

  • 验证环境(hrun -V,har2case -V)
    Python自动化测试学习3_第2张图片

  • 建议使用低版本的httprunner进行联系,或者学习一些4.x的操作:httprunner4.x

  • 五个命令

命令
httprunner 主命令
hrun httprunner的别名,用于运行yaml/json/pytest测试用例
hmake httprunner make的别名,将yaml/json转化成pytest文件
har2case httprunner har2case的别名,用于将har文件转化成yaml/json文件
locust 用于性能测试
  • 生成用例
    • 使用fiddler抓包导出har文件 (结合postman请求)
    • 打开pycharm将har文件转换为yaml文件
    • 运行yml文件
  1. 生成文件
命令
har2case xxx.har py文件的测试用例
har2case xxx.har -2y yaml文件的测试用例
har2case xxx.har -2j json文件的测试用例
  • 生成yaml文件
D:\PyCharm\Code\demo3\httprunner>har2case getTianqi.har -2y

在这里插入图片描述

Python自动化测试学习3_第3张图片

  1. 生成py文件
D:\PyCharm\Code\demo3\httprunner>hrun getTianqi.yml

Python自动化测试学习3_第4张图片

  • 踩坑:
    这里执行hrun的时候一直报错:Hint: make sure your test modules/packages have valid Python names.
    这是一个循环引用报错,原因是我将文件夹的名称设置为httprunner,与它本身的包文件起了冲突,_init_方法错误,后续更改文件夹名称即解决
  1. 执行py文件
    可以在执行结果中看到一些详细信息,包括请求信息以及响应信息
    Python自动化测试学习3_第5张图片
    Python自动化测试学习3_第6张图片
    在这里插入图片描述
2.3 建立HttpRunner测试项目
1. 创建一个httprunner的项目

这里我重新下载了hrun的版本 pip install httprunner==2.3.0

  • 查看版本号报错:hrun -V
    在这里插入图片描述
  • 参考解决
    Python自动化测试学习3_第7张图片
  • 检测版本
    在这里插入图片描述
  • 创建项目
    在这里插入图片描述
2. httprunner_api
  • 推荐一个免费的api接口网站
# demo_api.yml 写一条测试用例
name: 测试 api
variables:
    var1: value1
    var2: value2
request:
    url: https://eolink.o.apispace.com/xhdq/common/joke/getJokesByRandom
    method: POST
    headers:
        X-APISpace-Token: "xxxxxxxxxxxxxxxxxxx"
        Authorization-Type: "apikey"
        Content-Type: "application/x-www-form-urlencoded"
    data:
         pageSize: 5
validate:
    - eq: ["status_code", 200]
  • 执行完毕之后,会自动生成测试报告,存放在reports目录下
    Python自动化测试学习3_第8张图片
    Python自动化测试学习3_第9张图片
  • request请求库api讲解

python 中非常流行的客户端请求模块,功能强大,api清晰明了

  • 常用的api
request
method GET,OPTIONS,HEAD,POST,PUT,PATCH,DELETE
url 指定请求的url
headers 指定请求头参数
params 指定查询字符串参数
json 传json格式的参数
data 传www-form表单参数
3. httprunner框架的一些参数配置
 01  环境变量
  • 在项目目录下的.env文件中存放环境变量,可以 通过${ENV(xxx)}在yml文件中调用
    在这里插入图片描述
request:
    url: https://eolink.o.apispace.com/456456/weather/v001/now
    method: GET
    headers:
        X-APISpace-Token: "xxxxxxxxxxxxxxxxxxxxxx"
        Authorization-Type: "apikey"
    params:  # 指定查询的字符串
         areacode: ${ENV(AREACODE)}   # 调用环境变量
validate:
    - eq: ["status_code", 200]
D:\PyCharm\Code\demo5_hrun>hrun api/demo_api.yml --log-level debug
INFO     HttpRunner version: 2.3.0
INFO     Loading environment variables from D:\PyCharm\Code\demo5_hrun\.env
# 这里创建了环境变量
DEBUG    Set OS environment variable: AREACODE
... 
================== request details ==================
# 可以看到查询的url中拼接了参数 areacode=101010100
url : 'https://eolink.o.apispace.com/456456/weather/v001/now?areacode=101010100'
 02  全局变量
  • 因为环境变量是所有接口都可以调用的,如果希望变量只在当前接口生效,则可以通过定义全局变量实现
  • 通过$xxx调用全局变量
# birth_api.yml

name: 测试 api2
# 定义全局变量
variables:
    moon: "12"
    day: "15"
request:
    url: https://eolink.o.apispace.com/birthday-pwd/api/v1/xzw/birthday_pwd/
    method: GET
    headers:
        xxxx: "xxxxx"
    params:
         moon: $moon
         day: $day
validate:
    - eq: ["status_code", 200]

在这里插入图片描述

 03  httprunner_debugtalk.py
  • 如果需要动态地调用一些参数,可以通过在debugtalk.py文件中添加方法来实现
  • 在yml文件中通过${函数名()}调用
# debugtalk.py
import random

def get_moon():
    moon = ["1","2","3","4","5","6","7","8","9","10","11","12"]
    return random.choice(moon)
# birth_api.yml

params:
         moon: ${get_moon()}
 04  httprunner_baseurl
# base_url提取url中公共的域名部分
base_url: https://eolink.o.apispace.com
request:
    url: /birthday-pwd/api/v1/xzw/birthday_pwd/
 05  断言
validate:
    - eq: ["status_code", 201]
# 断言失败,实际与期望结果不符
DEBUG    start to validate.
DEBUG    extract: status_code   => 200
ERROR   
validate: status_code equals 201(int)   ==> fail
200(int) equals 201(int)
  • 断言的另一种写法,可以在package中查看更多种类
    D:\Python39-32\Lib\site-packages\httprunner\validator.py
validate:
    #- eq: ["status_code", 200]
    - {"check": "status_code", "comparator": "eq", "expect": 200}
    - {"check": "content", "comparator": "contains", "expect": "message"}
    - {"check": "content.message", "comparator": "eq", "expect": "OK"}
4. httprunner中extract响应数据提取
  • 接口间存在依赖关系,则可以在testcase目录下定义接口依赖关系

config:
    name: "获取项目列表信息配置"
    base_url: https://eolink.o.apispace.com
    
# 测试步骤
teststeps:
-
    name: 登录
    api: api/login.yml
    extract:
        # 把响应报文中的 token 取出来
        - # 创建一个token的变量
        - token: content.token
-
    name: 获取项目列表信息
    # 在api/get_list.yml可以调用token ($token)
    api: api/get_list.yml

5. httprunner的三种参数化
  1. 方式一: 直接在当前文件下,添加用例信息
  • 登录接口 api/login.yml
name: 测试login
variables:
    username: "kk"
    password: "pwd"
base_url: https://eolink.o.apispace.com
request:
    url: /api/login/
    method: POST
    headers:
        Content-Type : 	"application/json"
    json:
         username: $username
         password: $password
validate:
    - {"check": "status_code", "comparator": "eq", "expect": 200}
  • 登录接口配置 testcase/testcase_login.yml
config:
    name: "登录接口配置"
    base_url: https://eolink.o.apispace.com

teststeps:
-
    name: $title
    api: api/login.yml
    validate:
        - {"check": "status_code", "comparator": "eq", "expect": $status_code}
        - {"check": "content", "comparator": "contains", "expect": $contain_msg}
  • 登录接口套件 testsuits/login_suit.yml

config:
    name: "接口套件"

testcases:
-
    name: 登录接口套件
    testcase: testcases/login_testcase.yml
    parameters:
        # 方式一: 直接在当前文件下,添加用例信息
        - title-username-password-status_code-contain_msg:
            - ["正常登陆","keyou1","123456",200,"token"]
            - ["密码错误","keyou1","111111",400,"non_field_errors"]
            - ["账号错误","keyou1111","123456",400,"non_field_errors"]
            - ["用户名为空","","123456",400,"username"]
            - ["密码为空","keyou1","",400,"password"]
  1. 参数较多,参数复杂
  • 可以将测试用例信息存储在文件中
    Python自动化测试学习3_第10张图片
  • 在login_suit.yml中调用,使用 ${P(文件路径)},P代表获取参数
parameters:
     # 方式二:
     - title-username-password-status_code-contain_msg: ${P(datas/account.csv)}
  • 注意:在csv读取出来的数字或其他值,默认是字符串类型,可以在debugtalk.py中进行类型转化
  1. 动态生成用例
  • 在debugtalk.py中编写函数返回用例
def get_account():
    # 嵌套字典列表
    accounts = [
        {"title": "正常登陆", "username": "keyou1", "password": "123456", "status_code": 200, "contain_msg": "token"},
        {"title": "密码错误", "username": "keyou1", "password": "111111", "status_code": 400, "contain_msg": "non_field_errors"},
        {"title": "账号错误", "username": "keyou1111", "password": "123456", "status_code": 400, "contain_msg": "non_field_errors"},
        {"title": "用户名为空", "username": "", "password": "123456", "status_code": 400, "contain_msg": "username"},
        {"title": "密码为空", "username": "keyou1", "password": "", "status_code": 400, "contain_msg": "password"}
    ]
    return accounts
  • 在login_suit.yml中调用,使用 ${函数名()}
parameters:
     # 方式三:
     - title-username-password-status_code-contain_msg: ${get_account()}
  • 使用py文件运行用例
# run.py
from httprunner.api import HttpRunner

httprun = HttpRunner()
httprun.run(r"D:\PyCharm\Code\demo5_hrun\testsuites\login_suit.yml")
print(httprun.summary)

你可能感兴趣的:(软件测试,功能测试)