pytest测试框架+allure超详细教程

news2024/9/22 1:11:22

1、测试识别和运行

文件识别:

  • 在给定的目录中,搜索所有test_.py或者_test.py文件

用例识别:

  • Test*类包含的所有test_*的方法(测试类不能有__init__方法)
  • 不在类中的所有test_*方法
  • pytest也能执行unit test写的用例和方法

运行方式
1、pycharm页面修改默认的测试运行方式
settings页面,输入pytest,修改Default test runner

2、右键执行python文件
3、命令行界面执行,点击pycharm下方的terminal,打开命令行界面,执行pytest 命令

 4、pycharm代码边界界面,左侧单条用例运行按钮

5、主函数运行方式
在运行文件中编写主函数,主函数启动需要导入pytest包,不然找不到pytest方法

1

2

3

4

5

6

7

8

9

10

11

12

13

14

import pytest

  

class TestClass:

    def test_one(self):

        x = "this"

        assert "h" in x

  

    def test_two(self):

        x = "hello"

        assert hasattr(x, "check")

  

if __name__ == '__main__':

#    pytest.main()

    pytest.main("test_study.py")

pytest.main()会自动读取当前目录下的所有test开头的.py文件,运行test方法或者类

可以传入不同的参数,让运行更加定制化

1

2

3

4

5

6

7

8

pytest.main(['./'])               # 运行./目录下所有(test_*.py  和 *_test.py)

pytest.main (['./subpath1'])    # 运行./subpath1 目录下用例

pytest.main (['./subpath1/test_module1.py'])    # 运行指定模块

pytest.main (['./subpath1/test_module1.py::test_m1_1'])  # 运行模块中的指定用例

pytest.main (['./subpath2/test_module2.py::TestM2::test_m2_02'])  # 运行类中的指定用例

pytest.main (['-k','pp'])         # 匹配包含pp的用例(匹配目录名、模块名、类名、用例名)

pytest.main(['-k','spec','./subpath1/test_module1.py'])     # 匹配test_module1.py模块下包含spec的用例

pytest.main(['-k','pp','./subpath2/test_module2.py::TestM2'])   # 匹配TestM2类中包含pp的用例

2、参数化

@pytest.mark.parametrize(argnames,argvalues)

  • argnames:要参数化的变量,可以是string(用逗号分割),list,tuple
  • argvalues:参数化的值,list[tuple],以列表形式传入元组,每个元组都是一条测试数据
  • ids,:默认为none,用来重新定义测试用例的名称

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

# 使用string分割参数化的变量

@pytest.mark.parametrize('a,b',[(10,20),(30,40)])

def test_param(a, b):

    print(a,b)

# 使用list分割参数化的变量

@pytest.mark.parametrize(['a', 'b'],[(10,20),(30,40)])

def test_param(a, b):

    print(a,b)

# 使用tuple分割参数化的变量

@pytest.mark.parametrize(('a', 'b'),[(10,20),(30,40)])

def test_param(a, b):

    print(a,b)

# 使用ids重新定义用例名称

@pytest.mark.parametrize('a,b',[(10,20),(30,40)], ids=['case1', 'case2'])

def test_param(a, b):

    print(a,b)

yaml参数化
pip install PyYAML
yaml实现list

1

2

3

- 10

- 20

- 30

yaml实现字典

1

2

3

by: id

locator: name

action: click

yaml二维数组

1

2

3

4

5

6

7

8

9

10

11

12

companies:

  - id: 1

    name: company1

    price: 200w

  - id: 2

    name: company2

    price: 500w

fruites:

  - name: 苹果

    price: 8.6

  - name: 香蕉

    price: 2.6

读取yaml文件
yaml.safe_load(open(‘./data.yaml’))

3、测试报告美化-allure

1、操作系统内部先安装allure
2、安装allure-pytest插件

1

pip install allure-pytest

3、运行测试用例
查看pytest中allure相关的命令行参数

1

2

3

4

5

6

7

8

9

10

C:\Users\Administrator>pytest --help | findstr allure  <== linux 使用grep过滤

  --allure-severities=SEVERITIES_SET     <==  根据用例级别过滤需要执行的用例

  --allure-epics=EPICS_SET              

  --allure-features=FEATURES_SET         <== 根据用例设置的feature名称过滤需要执行的用例

  --allure-stories=STORIES_SET           <== 根据用例设置的story名称过滤需要执行的用例

  --allure-ids=IDS_SET  Comma-separated list of IDs.

  --allure-link-pattern=LINK_TYPE:LINK_PATTERN

  --alluredir=DIR       <== 指定存放用例执行结果的目录

  --clean-alluredir     清除alluredir文件夹(如果存在)

  --allure-no-capture   Do not attach pytest captured logging/stdout/stderr to

4、执行测试命令

1

2

# --alluredir: 用于指定存储测试结果的路径

pytest [测试文件] -vs --alluredir=./result/ --clean-alluredir

5、查看测试报告

在线查看报告,直接打开默认浏览器展示当前报告

1

2

# 注意这里的serve书写,后面接用例执行结果(./result/:就是存放执行结果的目录路径)

allure serve ./result/

从结果生成报告
1.生成报告

1

2

# 注意:覆盖路径加--clean

allure generate ./result/ -o ./report/ --clean

2.打开报告

1

allure open -h 127.0.0.1 -p 8883 ./report/

allure常用特性
支持在报告中查看测试功能、子功能或场景、测试步骤和测试附加信息等,可以通过@feature、@story、@step和@attach等装饰器实现

实现的步骤

  • import allure
  • 功能上加@allure.feature(“功能名称”)
  • 子功能上加@allure.story(“子功能名称”)
  • 用例标题@allure.title(“用例名称”)
  • 用例描述@allure.description(“用例描述”)
  • 步骤上加@allure.step(“步骤细节”)
  • @allure.attach(“具体文本信息”),需要附加的信息,可以是数据、文本、图片、视频和网页
  • 用例级别@allure.severity(级别)
  • 如果只测试登录功能运行的时候,可以加限制过滤

1

2

3

# 注意这里--allure-features中间是-中线, 需要使用双引号

#  不能过滤--allure-features下的--allure-stories

pytest 文件名 --allure-features="登录模块"

  • feature相当于一个功能,一个大模块,将case分类到某个feature中,报告中Behaviors(功能中展示),相当于testsuite
  • story相当于这个功能或者模块下的不能场景,分支功能,属于feature之下的结构,报告中features中展示,详单与tescase
  • feature与story类似于父子关系
  • 2、allure特性-step
  • 测试过程中每个步骤,一般放在具体逻辑方法中
  • 可以放在关步骤中,在报告中显示
  • 在app、web自动化测试中,建议每切换到一个新页面就做一个step
  • 用法:
  • @allure.step():只能以装饰器的形式放在类或者方法上面
  • with allure.step():可以放在测试用例方法里面,但是测试步骤代码需要被该语句包含

3、allure特性-testcase

关联测试用例,可以直接给测试用例的地址链接,一般用于关联手工测试用例
实力代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

import pytest

import allure

@allure.feature('用户登录')

class TestLogin:

    @allure.story('登录成功')

    def test_login_success(self):

        with allure.step('步骤1:打开应用'):

            print('打开应用')

        with allure.step('步骤2:进入登录页面'):

            print('进入登录页面')

        with allure.step('步骤3:输入用户名和密码'):

            print('输入用户名和密码')

        print('这是登录成功测试用例')

    @allure.story('登录失败')

    def test_login_fail(self):

        print('这是登录失败测试用例')

    @allure.story('登录失败')

    @allure.title('用户名缺失')

    def test_login_fail_a(self):

        print('这是登录失败测试用例')

    @allure.story('登录失败')

    @allure.testcase('https://www.baidu.com/', '关联测试用例地址')

    @allure.title('密码缺失')

    @allure.description('这是一个用例描述信息')

    def test_login_fail_b(self):

        with allure.step('点击用户名'):

            print('输入用户名')

        with allure.step('点击密码'):

            print('输入密码')

        print('点击登录')

        with allure.step('点击登录之后登录失败'):

            assert '1' == 1

按重要性级别 进行一定范围测试
通常测试用PO、冒烟测试、验证上线测试。按照重要性级别来分别执行
缺陷严重级别

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

1. Blocker级别——中断缺陷

    客户端程序无响应,无法执行下一步操作。

2. Critical级别――临界缺陷,包括:

    功能点缺失,客户端爆页。

3. Major级别——较严重缺陷,包括:

    功能点没有满足需求。

4. Normal级别――普通缺陷,包括:

    1. 数值计算错误

    2. JavaScript错误。

5. Minor级别———次要缺陷,包括:

    1. 界面错误与UI需求不符。

    2. 打印内容、格式错误

    3. 程序不健壮,操作未给出明确提示。

6. Trivial级别——轻微缺陷,包括:

    1. 辅助说明描述不清楚

    2. 显示格式不规范,数字,日期等格式。

    3. 长时间操作未给用户进度提示

    4. 提示窗口文字未采用行业术语

    5. 可输入区域和只读区域没有明显的区分标志

    6. 必输项无提示,或者提示不规范。

7. Enhancement级别——测试建议、其他(非缺陷)

   1. 以客户角度的易用性测试建议。

   2. 通过测试挖掘出来的潜在需求。

解决方法:

  • 通过附加pytest.mark标记
  • 通过allure.feature,allure.story
  • 也可以通过allure.servity来附加标记

步骤:
在方法,函数和类上面加:@allure.severity(allure.severity_level.TRIVIAL)
执行时过滤:pytest -vs [文件名] --allure-severities normal, critical

前端自动化测试-截图
前端自动化测试经常需要附加图片或html,在适当的地方,适当时机截图
@allure.attach 实现不同类型附件,可以补充测试步骤或测试结果
使用方式:

  • 在测试报告附加网页

1

2

allure.attach(body(内容), name, attachment_type, extension)

allure.attach('<body>这是一段html</body>', 'html测试', attachment_type=allure.attachment_type.HTML)

在测试报告附加图片

1

2

allure.attach.file(source, name, attachment_type, extension)

allure.attach.file('./123.jpg', name='这是一个图片', attachment_type=allure.attachment_type.JPG)

示例代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

import allure

def test_attach_text():

    allure.attach('这是一个纯文本', attachment_type=allure.attachment_type.TEXT)

def test_attach_html():

    allure.attach('<body>这是一段html</body>', 'html测试', attachment_type=allure.attachment_type.HTML)

def test_attach_phote():

    allure.attach.file('./123.jpg', name='这是一个图片', attachment_type=allure.attachment_type.JPG)

def test_attach_video():

    allure.attach.file('./123.mp4',name='这是一个视频',attachment_type=allure.attachment_type.MP4)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

import allure

from selenium import webdriver

import time

import pytest

@allure.testcase('https://www.baidu.com/', '百度搜索功能')

@pytest.mark.parametrize('data',

                         ['allure', 'pytest', 'unittest'],

                         ids=['search allure', 'search pytest', 'search unittest']

                         )

def test_search(data):

    with allure.step('步骤1:打开浏览器输入百度地址'):

        driver = webdriver.Chrome()

        driver.implicitly_wait(5)

        driver.get('https://www.baidu.com/')

    with allure.step(f'步骤2:在搜索框中输入{data}, 并点击百度一下'):

        driver.find_element_by_id('kw').send_keys(data)

        driver.find_element_by_id('su').click()

        time.sleep(2)

    with allure.step('步骤3: 截图保存到项目中'):

        driver.save_screenshot(f'./result/{data}.jpg')

        allure.attach.file(f'./result/{data}.jpg', name=f'搜索{data}的截图', attachment_type=allure.attachment_type.JPG)

        allure.attach(driver.page_source, f'搜索{data}的网页内容', allure.attachment_type.HTML)

    with allure.step('步骤4:关闭浏览器,退出'):

        driver.quit()

 最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走! 希望能帮助到你!【100%无套路免费领取】

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1927539.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一个真正有本事的人,往往有这4个特征,遇见一定要深交!

点击上方△腾阳 关注 转载请联系授权 你好&#xff0c;我是腾阳。 根据社会学和心理学的研究&#xff0c;一个人在其一生中可能会有更深层次交往的人数通常是有限的。 英国人类学家罗宾邓巴提出了著名的“邓巴数字”&#xff0c;即一个人能够维持稳定社交关系的人数大约在15…

使用嵌入式知识打造智能手环:nRF52蓝牙开发实战(C++/BLE/传感器)

项目概述 现代人越来越注重健康管理&#xff0c;智能穿戴设备应运而生。本项目旨在利用低功耗蓝牙芯片nRF52832&#xff0c;结合加速度计、心率传感器、陀螺仪等传感器&#xff0c;开发一款功能完善、性能稳定的智能运动手环。该手环能够实时采集用户的运动数据和生理指标&…

c++ map operator[] 陷阱

背景&#xff1a;以前做的一个功能&#xff0c;在程序中保存了一个map&#xff0c;这个map的类型是这样的&#xff1a; std::map<int, std::set<自定义类型>>&#xff0c;一般情况下这个 set 只有一个元素&#xff0c;特殊情况是允许set有两个元素。现在是项目测试…

线程间通信与变量修改感知:几种常用方法

线程间通信与变量修改感知&#xff1a;几种常用方法 1. 使用volatile关键字2. 使用synchronized关键字3. 使用wait/notify/notifyAll机制4. 使用轮询&#xff08;Polling&#xff09; &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在Java…

入选中国信通院首期全景图,美创数据安全再显“专、精、全”

近日&#xff0c;中国信息通信研究院&#xff08;简称“中国信通院”&#xff09;正式发布《数字安全护航技术能力全景图》&#xff0c;共划分为14项一级目录103项二级目录&#xff0c;从391家报名厂商中审核评估&#xff0c;共收录147家厂商。 美创科技入选21个细分领域&#…

unity3d脚本使用start,updata,awake

最近学了一下unity&#xff0c;脚本编写用的c#&#xff0c;虽说没学过c#但是勉强根据教学还能写点代码。 在这里我来记录一下在我学习过程中感觉最重要的东西 消息函数&#xff1a; 在我们创建一个脚本文件的时候&#xff0c;我们首先可以看到两个默认给你写出来的函数。 这两…

数据结构——单链表与双链表(java实现)

文章目录 前言链表&#xff1a;链表分类&#xff1a; 一 单链表单链表的实现&#xff1a;节点的实现头插法&#xff1a;尾插法在任意位置插入数据&#xff1a;查找单链表中是否有key关键字&#xff08;即是否有值为key的数据&#xff09;删除第一次出现的关键字为key的节点删除…

深度解析:如何优雅地删除GitHub仓库中的特定commit历史

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

2024.7.15 csp-j第一场模拟赛赛后总结

题目&#xff1a; T1&#xff1a;P1211 [USACO1.3] 牛式 Prime Cryptarithmhttps://www.luogu.com.cn/problem/P1211 T2&#xff1a;P2035 [USACO08JAN] iCow Bhttps://www.luogu.com.cn/problem/P2035 T3&#xff1a;P6207 [USACO06OCT] Cows on Skates Ghttps://www.luogu…

CUDA cuDNN和pytorch(GPU版)的完整安装教程

​ * 说明: 本教程使用wsl-ubuntu20.04, 其他发行版linux的命令可能有所区别. *实测机型: i5-13500HX | RTX 4060 Laptop 一、下载CUDA12.X版本 这里以下载CUDA12.2为例。 前往cuda-12.2下载页, 按照如图方式选择合适的选项&#xff1a; 按照官方给出的命令&#xff0c; 在b…

《昇思25天学习打卡营第22天|基于MindSpore的GPT2文本摘要》

#学习打卡第22天# 1. 数据集 1.1 数据下载 使用nlpcc2017摘要数据&#xff0c;内容为新闻正文及其摘要&#xff0c;总计50000个样本。 from mindnlp.utils import http_get from mindspore.dataset import TextFileDataset# download dataset url https://download.mindspor…

leetcode-349.两个数组的交集

题源 349.两个数组的交集 题目描述 给定两个数组 nums1 和 nums2 &#xff0c;返回 它们的 交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。 示例 1&#xff1a; 输入&#xff1a;nums1 [1,2,2,1], nums2 [2,2] 输出&#xff1a;[2] 示例…

深度解读昇腾CANN模型下沉技术,提升模型调度性能

AI模型的运行通常情况下需要CPU和NPU&#xff08;昇腾AI处理器&#xff09;等AI专用处理器协同工作&#xff0c;CPU所在位置称为主机端&#xff08;Host&#xff09;&#xff0c;而NPU所在位置称为设备端&#xff08;Device&#xff09;。对于采用Host调度的AI模型来说&#xf…

金蝶云星空与金蝶云星空对接集成付款单查询打通[标准][付款单新增]-v1

金蝶云星空与金蝶云星空对接集成付款单查询打通[标准][付款单新增]-v1 对接源平台:金蝶云星空 金蝶K/3Cloud在总结百万家客户管理最佳实践的基础上&#xff0c;提供了标准的管理模式&#xff1b;通过标准的业务架构&#xff1a;多会计准则、多币别、多地点、多组织、多税制应用…

vitest 单元测试应用与配置

vitest 应用与配置 一、简介 Vitest 旨在将自己定位为 Vite 项目的首选测试框架&#xff0c;即使对于不使用 Vite 的项目也是一个可靠的替代方案。它本身也兼容一些Jest的API用法。 二、安装vitest // npm npm install -D vitest // yarn yarn add -D vitest // pnpm pnpm …

CoT-SC论文速读

1.论文速读 本文提出了一个重要的Decoder策略为&#xff1a;“Self-Consistency”,并将其用在CoT的Prompt工作中。 该策略作用&#xff1a;让LLM在处理复杂问题时&#xff0c;让他尝试多个推理路径&#xff0c;每一个推理路径都是一次CoT&#xff08;Chain of Thought&#x…

构建实用的NLP应用程序:重塑人类与计算机的协同工作方式

文章目录 一、NLP技术的核心价值二、构建实用NLP应用程序的关键步骤三、NLP应用程序在协同工作中的创新应用《赠ChatGPT中文范例的自然语言处理入门书》编辑推荐内容简介作者简介精彩书评目录前言/序言获取方式 在数字化时代&#xff0c;自然语言处理&#xff08;NLP&#xff0…

哥德巴赫猜想c++

方法一 #include<bits/stdc.h> using namespace std; //定义函数&#xff0c;判断素数 bool sushu(int n){bool rtrue;//先假设是素数&#xff0c;即真//循环因子范围&#xff0c;找到一个因子就不是素数for(int i2;i<sqrt(n);i){//判断2~n的根号是否素数if(n%i0){//…

码住!热门且创新idea:GNN+强化学习!

如何提高学习效率、优化策略&#xff0c;并解决复杂的图结构相关问题&#xff1f;或许你可以考虑&#xff1a;GNN强化学习。 GNN结合强化学习是当前的热门创新方向&#xff0c;它通过利用GNN在图形数据上的强大表示能力与强化学习在决策制定中的优势&#xff0c;不仅能够有效处…

鸿蒙语言基础类库:【@ohos.uitest (UiTest)】 测试

UiTest UiTest提供模拟UI操作的能力&#xff0c;供开发者在测试场景使用&#xff0c;主要支持如点击、双击、长按、滑动等UI操作能力。 该模块提供以下功能&#xff1a; [By]&#xff1a;提供控件特征描述能力&#xff0c;用于控件筛选匹配查找。[UiComponent]&#xff1a;代…