【世界播资讯】第十一章 自动化测试 Pytest

哔哩哔哩   2023-07-04 13:23:52

一,pytest配置项 

在主目录ApiTest下面新建一个File(注意这里不是测试用例的 python File ),命名为

[pytest]

testpaths=./test_xx(具体目录/文件)#执行时就只执行该目录下的测试用例


(资料图)

补充:点三角符号执行多条测试用例,引入main函数

if __name__ =='__main__':

()

会把当前py文件中的所有测试用例全部执行

二,setup/teardown

前置操作和后置操作:

ui自动化,前置打开浏览器,后置关闭浏览器

接口自动化, 前置登录或插入测试数据,后置清理垃圾数据

模块级    setup_module/teardown_module  开始于模块始末,生效一次

函数级    setup_function/teardown_function   对每条函数用例生效(不在类中)

类级      setup_class/teardown_class    只在类中前后运行一次(在类中)

方法级    setup_method/teardown_method  开始于方法始末(在类中)

具体使用:

(1)模块级   不管有几条测试用例,只执行一次

def  setup_module():

print(“准备测试数据”)

def  eardown_module():

print(“清理测试数据”)

会遇到清理测试数据在准备测试数据前的情况,这种为控制台显示问题,其实执行顺序是正确的

(2)函数级  对每个函数都会执行一次

def  setup_function():

print(“准备测试数据”)

def  eardown_function():

print(“清理测试数据”)

(3)类级  和模块级类似,在类中只执行一次

classTestMobile:

def  setup_class(self):

print(“准备测试数据”)

def  eardown_class(self):

print(“清理测试数据”)

def test_mobile(self):

。。。

def test_baidu(self):

。。。

需要放在类中的内容圈起来,用tab键调下格式,方法重要加上 self

(4)方法级    对类中的每个函数都会执行一次

classTestMobile:

def  setup_method(self):

print(“准备测试数据”)

def  eardown_method(self):

print(“清理测试数据”)

def test_mobile(self):

。。。

def test_baidu(self):

。。。

三,fixture

fixture是pytest用于将测试前后进行预备,清理工作的代码处理机制。

fixture相对于setup/teardown来说有一下几点优势:

fixture命名更加灵活,局限性比较小

比如:一个测试.py文件中写了10条测试用例,只有5条想要执行前置后置步骤,就不要需要分成两个文件来处理

配置里面可以实现数据共享,不需要import就能自动找到一些配置

fixture夹具,@

(scope='function')  每一个函数或方法都会调用

(scope='class')  每一个类调用一次

(scope='module')  每一个.py文件会调用一次

(scope='session')  多个文件调用一次,.py文件就是module

fixture的作用范围:session>module>class>function

具体应用:

import request

import pytest

@

def func():

print(“我是前置步骤”)

def test_mobile(func):#传func方法执行前置

。。。

def test_baidu():#不传func方法不执行前置

。。。

**

①def func(autouse=true):#范围内所有函数都执行,不管是否传func,可以在测试方法中不用一一去添加fixture的名称   

#autouse默认为false

**

②def func(scope=“function”) : ==   def func():

#scope默认为function

四,YAML写法

(1)对象

key:

child-key:value

child-key2:value2

等于

{“key”:{“child-key”:“value”,“child-key2”:“value2”}}

(2)数组

key:

-A

-B

-C

等于

{“key”:[A,B,C]}

(3)组合

key:

-child-key:value

child-key2:value2

等于

{“key”:[{“child-key”:“value”,“child-key2”:“value2”}]}

(4)数组嵌套

key:

-

-A

-B

-C

等于

{“key”:[[A,B,C]]}

具体用法:

在主目录ApiTest下面新建一个普通文件夹Directory,命名为config

再在config文件下建立一个file,命名为文件

(1)

hero:     #   对象

name: 安琪拉

word: 火焰是我最喜欢的玩具

HP: 血量

补充:也可以用字典形式来写

hero:{name: 安琪拉,word: 火焰是我最喜欢的玩具,HP: 血量}

(2)

hero_name: #数组

-安琪拉

-小乔

-李白

(3)

hero2:     #   组合(字典外面包一个数组)

-name: 小乔

word: 风,听从我的呼唤

HP: 血量

(4)

hero_name2: #数组嵌套(数组外面包一个数组)

-

-安琪拉

-小乔

-李白

五,YAML读取方式:

第三方包安装:pip install pyyaml

在主目录ApiTest下面新建一个普通文件夹python package,命名为utils

#主要用来放各种工具

utils下在新建一个python file 命名为 read_

import yaml

f=open("../config/",encoding="UTF-8")#打开文件

data=_load(f)

print(data)

print(data['hero'])#也可以打印具体的某个数据

补充:很多数据放在json的话就比较乱,层级也不容易看,所以用yaml更便捷一些

json:

[{

"key":"value"

}

]

六,参数化 parametrize

参数化可以组装测试数据,在测试前定义好测试数据,并在测试用例中使用

#单次循环

@("a",["b"])   #   (字符串  “”,数组  [])

def test_parametrize(a):

print(a)

#多次循环

@("a,b",[("c","d"),("e","f")])

def test_parametrize(a,b):

print(a,b)

具体用法:

在testcase下面新建python package 命名为test_parametrize

再在下面新建python file  命名为test_parametrize_01

import pytest

#单参数单次循环

@("name",["小白"])

def test_parametrize(name):

print(“测试parametrize,我的名字是”+name)

#单参数多次循环

@("name",["小白",“哈基米”,“小乔”])

def test_parametrize(name):

print(“测试parametrize,我的名字是”+name)

#多参数单次循环

@("name,age",[("哈基米",“3”)])

def test_parametrize(name,age):

print(“测试parametrize,我的名字是”+name+",年龄是"+age+“岁。”)

注意:单次循环写法@("name,age",[["哈基米",“3”]]) #用[]数组也可以,()元组也可以

@("name,age",["哈基米",“3”])#这样写是错误的

#多参数多次循环

@("name,age",[["小白","35"],[“哈基米”,"3"],[“小乔”,"18"])

def test_parametrize(name,age):

print(f‘{name}的年龄是{age}’)

六,数据驱动  参数化 parametrize+yaml

①在文件中定义参数

mobile_params:# 定义 number,appkey 

# 功能同params1={“number”:“13167894587”,“appkey”:“0c565f14687d84”}# python中字典数据类型

- [13167894587,0c565f14687d84]

- [13187465319,0c554ge9go0235]

②在测试用例中

import requests 

import get_data 

@("number,appkey",get_data()['mobile_params'])

def test_mobile(number,appkey):

params01={"shouji":number,"appkey":appkey}

r = (url="",params=params01)

print (_code)  

print (())

assert _code==200

七,allure报告

allure常用方法

1、title 标题

可以自定义用例标题,标题默认为函数名。@

2、description 描述

可以添加测试的详细说明

3、标签 @

4、标签@

5、 标签 @

定义用例的级别,Graphs主要有BLOCKER,CRITICAL,MINOR,NORMAL,TRIVIAL等几种类型,默认是NORMAL。

只运行指定级别的用例 --allure_severities=critical,blocker

6、 动态生成

可以使用函数体内的数据动态生成

使用方式

1)安装python插件

使用命令安装

$ pip3 install allure-pytest

2)配置

[pytest]

testpaths = ./testcases

markes =

p0:高优先级

test:测试环境

pro:生产环境

addopts = -vs -- alluredir./report        # 执行测试用例的报告都会放在这个目录下面

##如果单个函数运行,会在当前目录下生成一个report文件

##还可以通过命令行运行 pytest  testcase/test_  终端执行时会在根目录生成report文件(中配置的路径)

##report文件下包含:

    日志输出

     测试用例前后操作,执行时间,结束时间

   本条测试用例的执行结果

ps:在线json校验格式化工具:

3)打开报告

终端 输入allure,显示allure帮助文档

①allure serve ./report   自动打开报告  # 也可以使用绝对路径

②allure generate report     生成报告(allure-report文件在根目录下) 

allure open  allure-report  跟②结合使用

③allure generate report -o allure-report1  (通过-o  自定义报告名称)

八,Jenkins配置

Jenkins创建项目

打开Jenkins

(1)安装allure插件

主页--系统管理--插件管理(plugin manager)-- 可选插件--输入allure,不用回车,自动出现,勾选安装

主页--系统管理--全局工具配置--配置Allure Commandline--新增Allure Commandline--输入别名 allure,勾选自动安装,版本选择应用,保存

(2)新建一个freestyle项目

主页--create a job --  任务名称自定义,选择第一个(自由风格的软件项目)--

①描述,

②勾选丢弃旧的构建,保持构建天数:5,保持构建最大个数:5,

③增加源码,

源码管理 :repository url:git项目中克隆/下载,https,复制地址;

添加凭据:username with password  ,输入用户名,密码(git登录用账号);

分支:*/master;

定时构建:日程表:*9***(每天早上9点运行);

构建环境:勾选 delete workspace before build starts

构建:执行shell         

#!/bin/bash  

cd $ {WORKSPACE}   

pip3 install -r -- user

pytest  #如果需要指定用例目录 加上用例path

构建后操作:

path:report  #中定义的

点击应用,保存

之后就可以使用,点击构建

可以点击allure report 查看报告