pytest+allure 汇总

pytest使用简介

运行多条用例方式

执行当前目录下所有的用例:pytest  ./py.test [包名]
执行单独一个pytest模块:pytest  文件名.py
运行某个模块里面某个类:pytest  文件名.py::类名
运行某个模块里面某个类里面的方法:pytest 文件名.py::类名::方法名 :

测试装置介绍

         类型                              规则
setup_module/teardown_module            全局模块级
setup_class/teardown_class              类级,只在类中前后运行一次
setup_function/teardown_function        函数级,在类外
setup_method/teardown_methond           方法级,类中的每个方法执行前后
setup/teardown                          在类中,运行在调用方法的前后(重点)

常用命令行参数

复制代码
—help 查看帮助命令
-x   用例一旦失败(fail/error),就立刻停止执行-m  标记用例
-k  执行包含某个关键字的测试用例
-v 打印详细日志
-s 打印输出日志(一般-vs一块儿使用)
—collect-only(测试平台,pytest 自动导入功能 )
--maxfail=num 用例达到

--使用缓存状态

--lf(--last-failed) 只重新运行故障。
--ff(--failed-first) 先运行故障然后再运行其余的测试

复制代码

Mark:标记测试用例

  • 场景:只执行符合要求的某一部分用例 可以把一个web项目划分多个模块,然后指定模块名称执行。
  • 解决: 在测试用例方法上加 @pytest.mark.标签名
  • 执行: -m 执行自定义标记的相关用例
    • pytest -s test_mark_demo.py -m=webtest
    • pytest -s test_mark_demo.py -m apptest
    • pytest -s test_mark_demo.py -m "not ios"

Mark:跳过(Skip)及预期失败(xFail)

  • 这是pytest 的内置标签,可以处理一些特殊的测试用例【不能成功的测试用例】
  • skip - 始终跳过该测试用例
    复制代码
    场景:
    1、调试时不想运行这个用例
    2、标记无法在某些平台上运行的测试功能
    3、在某些版本中执行,其他版本中跳过
    
    demo:
    连接数据库的功能如果返回结果未成功就跳过,因为执行也都报错
    解决1:添加装饰器
         @pytest.mark.skip
         @pytest.mark.skipif
    解决2:代码中添加跳过代码
         @pytest.skip(reason)
    复制代码
  • skipif - 遇到特定情况跳过该测试用例
  • xfail - 遇到特定情况,产生一个“期望失败”输出
    与skip 类似 ,预期结果为fail ,标记用例为fail
    用法:添加装饰器@pytest.mark.xfail

pytest 参数化:Mark:参数化测试函数

复制代码
测试场景
    测试登录成功,登录失败(账号错误,密码错误)
    创建多种账号: 中⽂文账号,英⽂文账号
普通测试用例方法
    Copy多份代码 or 读⼊入参数?
    一次性执⾏多个输⼊入参数
pytest参数化实现方法
    @pytest.mark.parametrize进行参数化和数 据驱动更灵活

Mark:参数化测试函数使用

  • 单参数

        search_list = ['appium','selenium','pytest'] 

        @pytest.mark.parametrize('name',search_list)

        def test_search(name):

            assert name in search_list

  • 多参数

     @pytest.mark.parametrize("test_input,expected",[("3+5",8),("2+5",7),("7+5",12)])

     def test_mark_more(test_input,expected):
         assert eval(test_input) == expected

  • 用例重命名 ids实现

     @pytest.mark.parametrize("test_input,expected",[("3+5",8),("2+5",7),("7+5",12)],ids=['add_3+5=8','add_2+5=7','add_3+5=12'])
     def test_mark_more(test_input,expected):
         assert eval(test_input) == expected

复制代码

 Python 代码执行 pytest

  • 使用 main 函数
    复制代码
    if __name__ == '__main__':
        # 1、运行当前目录下所有符合规则的用例,包括子目录(test_*.py 和 *_test.py)
        pytest.main()
        # 2、运行test_mark1.py::test_dkej模块中的某一条用例
        pytest.main(['test_mark1.py::test_dkej','-vs'])
        # 3、运行某个 标签
        pytest.main(['test_mark1.py','-vs','-m','dkej'])
     
    运行方式
      `python test_*.py `
    复制代码
  • 使用python -m pytest调用 pytest(jenkins持续集成用到)

常用的异常处理方法

  • try…except
    复制代码
    try:
        可能产生异常的代码块
    except [ (Error1, Error2, ... ) [as e] ]:
        处理异常的代码块1
    except [ (Error3, Error4, ... ) [as e] ]:
        处理异常的代码块2
    except  [Exception]:
        处理其它异常
     
    复制代码
  • pytest.raises()
    复制代码
    获取捕获的异常的细节(异常类型,异常信息)
    发生异常,后面的代码将不会被执行

    def test_raise():
        with pytest.raises(ValueError, match='must be 0 or None'):
            raise ValueError("value must be 0 or None")

    def test_raise1():
        with pytest.raises(ValueError) as exc_info:
            raise ValueError("value must be 45")
                assert exc_info.type is ValueError
                assert exc_info.value.args[0] == "value must be 45"

    复制代码

 

Allure介绍

  • allure 是个轻量级的、灵活的,支持多语言的测试报告工具;
  • 多平台的, 奢华的report框架;
  • 提供详尽的的测试报告、测试步骤、log;
  • Java语言开发的,支持pytest,JaveScript, PHP, ruby
  • 可以集成到Jenkins

wins环境准备

  java jdk
  作用:allure运行依赖java jdk,否则运行allure时会报错
  下载:java_jdk_1.8.0

  allure
  作用:allure服务,展示测试报告
  下载:allure-commandline

  allure-pytest
  作用:python代码中调用pytest,完成测试数据收集、日志收集
  安装:pip install allure-pytest
  查看版本:allure --version

 官方文档:https://docs.qameta.io/allure/

allure 特性:

 -- feature/story

  • Feature 与 story的关系
  • Feature 相当于⼀个功能,⼀个⼤的模块;
  • Story相当于对应这个功能或者模块下的不同场景,分支功能;
  • Feature和story类似⽗⼦关系

复制代码
import pytest
import allure


@allure.description("测试相加的各种情况")
@allure.severity("critical")               # 优先级,包含blocker, critical, normal, minor, trivial 几个不同的等级
@allure.feature("测试功能_111")           # 功能块,feature功能分块时比story大,即同时存在feature和story时,feature为父节点
@allure.story("测试模块_222")             # 功能块,具有相同feature或story的用例将规整到相同模块下,执行时可用于筛选
# @allure.testcase("用例名:测试字符串相等")      # 用例标识,关联标识用例,可为一个url链接地址
@allure.testcase("http://www.xxx.com/id=1")
def test_case01(para_one, para_two):
    """用例描述:测试字符串相等
    :param para_one: 参数1
    :param para_two: 参数2
    """
    logging.info("这是测试的信息,在log中输出")
    # 获取参数
    paras = vars()
    # 关联的资料信息, 可在报告中记录保存必要的相关信息
    allure.attach("用例参数", "{0}".format(paras))
复制代码

 -- severity

  • Blocker级别:中断缺陷(客户端程序⽆响应,⽆法执⾏下⼀步操作)
  • Critical级别:临界缺陷( 功能点缺失)
  • Normal级别:普通缺陷(数值计算错误)
  • Minor级别:次要缺陷(界⾯错误与UI需求不符)
  • Trivial级别:轻微缺陷(必输项⽆提示,或者提示不规范)

 -- step

  • 测试过程中每个关键步骤;
  • 在app, web自动测试当中,建议每切换到一个新的页面,当做一个step;

复制代码
            with allure.step("步骤"+str(temp)+":"+name):
                TestInterface.log.info("开始%s接口测试:" % name)
                url = self.path + url
                arg = args % TestInterface.dic
                TestInterface.log.info("请求参数:%s" % arg)
                if str(is_token) == "1":
                    result = self.opener.header_content_token(path=url, arg=arg, phone=TestInterface.dic['phone'], token=TestInterface.dic['token'])
                else:
                    result = self.opener.header_content(path=url, arg=arg, phone=TestInterface.dic['phone'])
View Code
复制代码

 -- issue,testcase 

  • 关联测试用例;
  • 关联bug

复制代码
import pytest
import allure


@allure.issue('http://www.jira.com/id=1')
@allure.testcase('http://www.testlink.com/id=1')
def test_demo():
    print('this is test')
    with allure.step("打开首页"):
        allure.attach("参数")
View Code
复制代码

 -- parameters

  • 一次运行多个测试用例,变量参数化

复制代码
@pytest.mark.parametrize('test_data1', ['allure', 'pytest', 'unittest'])
def test_steps_demo(test_data1):
    with allure.step('step one:打开浏览器输入网址'):

        driver = webdriver.Chrome(executable_path='/Users/driver/chromedriver')
        driver.get('https://www.baidu.com')
    with allure.step('step two:搜索allure,并点击百度一下'):

        driver.find_element_by_id('kw').send_keys(test_data1)
        time.sleep(1)
        driver.find_element_by_id('su').click()
        time.sleep(1)
打开网页demo
复制代码

allure – 运行不同测试用例

•按features运行用例
  pytest --alluredir= log/report/xml --allure_features=测试登录功能,指定用例 testcases/alluredemo
•按story运行用例
  pytest --alluredir= log/report/xml --allure_stories=测试已登录的场景 testcases/alluredemo
•按severity运行用例
  pytest --alluredir= log/testreport/json --allure_severities=blocker testcases/alluredemo

 

allure 命令行生成报告

    查看帮助文档:allure -h

 语法格式

allure [options] [command] [command options]

options 列表

复制代码
Options:【用的少】
    --help 命令行帮助文档
    -q, --quiet
      切换至安静模式
      Default: false
    -v, --verbose
      切换至冗长模式
      Default: false
    --version
      版本信息
      Default: false
复制代码

command 列表

generate
serve
open

generate 命令

作用:生成最终版html 报告【文件在指定磁盘可查】

语法格式:allure generate [options]  报告目录【如:allure generate --clean-alluredir log/testreport/xml -o log/testreport/html】

【注】allure 结果目录就是运行 pytest 命令,--alluredir 跟的那个目录

命令选项:

最常用的就是 -c 、 -o 两个参数。

open 命令行参数

作用:打开已经生成的allure报告,就是打开 generate 命令生成的报告。

语法格式:open [options] allure报告目录 【allure open allure报告】

命令选项

 

备注:open常于allure generate 一起使用

serve 命令行参数

作用:启动 allure 服务,生成在线版本报告

语法格式

      serve [options] allure结果目录 

命令选项

复制代码
命令格式:allure  [option]   [command]   [command options]

# 收集测试结果   -sq 详细信息
pytest  [测试文件] -s –q --alluredir=./result/ (—alluredir这个选项 用于指定存储测试结果的路径)
pytest -sq --alluredir=./allure

查看测试报告
方式一:生成在线测试报告,会直接打开默认浏览器展示当前报告:allure serve
# 打开 allure 报告命令
allure serve ./allure

方式二:生成最终版本测试报告:allure generate + allure open
# 生成 allure 的 html 报告
allure generate -c -o ./allure-report ./allure
# 打开 allure 报告
allure open ./allure-report
浏览器打开 allure 报告的两种方式
复制代码

 

allure使用汇总

 

 

 

posted @   钟爱酷夏  阅读(224)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示