Allure

Allure快速入门

2021-10-31  本文已影响0人  Surpassme

1.关于Allure

    Allure框架是一个灵活轻量级多语言测试报告工具,它不仅可以以WEB的方式展示简介的测试结果,而且允许参与开发过程的每个人从日常执行的测试中最大限度的提取有用信息。
    Allure报告简化了常见缺陷的统计:失败的测试可以分为BUG和被中断的测试,还可以配置日志、步骤、fixture、附件、计时、执行历史以及与BUG管理系统集成,所以,通过以上配置,所有负责的开发人员和测试人员可以尽可能的掌握测试信息。

2.Allure安装

https://www.oracle.com/java/technologies/downloads/

    以Windows为例,如下所示:

JAVA_HOME=D:\Program Files\Java
Path中添加%JAVA_HOME%\bin

    在命令行中分别输入以下命令,不报错,即代表设置成功

C:\Users\admin>java -version
java version "17.0.1" 2021-10-19 LTS
Java(TM) SE Runtime Environment (build 17.0.1+12-LTS-39)
Java HotSpot(TM) 64-Bit Server VM (build 17.0.1+12-LTS-39, mixed mode, sharing)

C:\Users\admin>javac -version
javac 17.0.1
https://github.com/allure-framework/allure2/releases/
Path=D:\Program Files\Allure\allure-2.16.0\bin

    在命令行中输入allure,不出现报错即可

Usage: allure [options] [command] [command options]
  Options:
    --help
      Print commandline help.
    -q, --quiet
      Switch on the quiet mode.
      Default: false
      ...

3.Allure用法

3.1 语法格式

 allure [options] [command] [command options]

3.2 常用option和command

1.generate常用参数主要为-c和-o
2.open常用参数主要为-h和-p

4.Allure报告结构

    报告总览

    类别,允许用户创建自定义的类别。默认分为失败和错误,在执行结果是其中一类时则被归到相应的类中。

    测试套件,即所有用例的层级关系,可以按package/module/class/method进行查找

    测试结果图形化,包含测试用例的运行结果分布图、耗时、优先级等

    时序图,将测试用例的执行顺序和测试时间以可视化形式展现出来

    行为驱动,根据Epic、Feature、Story来对测试用例进行分组

    用例按Package进行分组,根据测试结果按不同的Package进行分组,并以树形结构进行展示

5.Allure特性

5.1 Flaky

    该特性用来标识不够稳定的测试用例集,即有些用例运行时,时而成功时而失败。其用意主要如下所示:

    用法如下所示:

@Flaky
public void aTestWhichFailsFromTimeToTime {
     ...
}

5.2 Environment

    Environment表示环境变量参数,用来显示本次测试运行环境的参数。在生成allure-result结果前,通过创建environment.propertiesenvironment.xml文件,并把文件放置到allure-result目录中。

environment.properties

Browser=Chrome
Browser.Version=95.0
Stand=Production

environment.xml

<environment>
    <parameter>
        <key>Browser</key>
        <value>Chrome</value>
    </parameter>
    <parameter>
        <key>Browser.Version</key>
        <value>95.0</value>
    </parameter>
    <parameter>
        <key>Stand</key>
        <value>Production</value>
    </parameter>
</environment>

environment.properties和environment.xml不允许存在中文

5.3 Categories

    默认分类分为两种,如下所示:

    除了默认分类之外,也可以自定义创建分类。通过创建categories.json文件,在生成allure-result结果前,提前放置到该目录即可。

categories.json

[
  {
    "name": "Ignored tests", 
    "matchedStatuses": ["skipped"] 
  },
  {
    "name": "Infrastructure problems",
    "matchedStatuses": ["broken", "failed"],
    "messageRegex": ".*bye-bye.*" 
  },
  {
    "name": "Outdated tests",
    "matchedStatuses": ["broken"],
    "traceRegex": ".*FileNotFoundException.*" 
  },
  {
    "name": "Product defects",
    "matchedStatuses": ["failed"]
  },
  {
    "name": "Test defects",
    "matchedStatuses": ["broken"]
  }
]

6.Allure与Pytest集成

6.1 Allure行为驱动

    allure除了支持Pytest自带的特性之外(fixture、parametrize、xfail、skip),自身也有非常强大的特性,下面来详细介绍。

6.1.1 @allure.step

    allure报告允许对每个测试用例的执行步骤进行详细说明,该功能通过@allure.step()装饰器来实现

@allure.step()只有一个参数,就是title

6.1.2 @allure.attach

    allure报告支持添加附件并进行展示,可用以补充测试结果,第一种基本语法如下所示:

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

allure.attachment_type主要有TEXT、CSV、HTML、XML、JSON、YAML、PCAP、PNG、JPG、SVG、GIF、BMP、MP4、OGG、WEBM、PDF等

    第二种基本语法如下所示:

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

6.1.3 @allure.description

    给用例添加详细的描述,常见语法有三种:

相当于传一个HTML代码组成的字符串,类似 allure.attach()中传HTML

方式一和方式二作用和效果是一样的

6.1.4 @allure.title

    添加测试用例标题,支持占位符传递关键字参数(动态标题,结合(@pytest.mark.parametrize使用)

如果没有添加 @allure.title()的话,测试用例的标题默认就是函数名

6.1.5 @allure.link&@allure.issue&@allure.testcase

    三个装饰器源码如下所示:

def link(url, link_type=LinkType.LINK, name=None):
    return safely(plugin_manager.hook.decorate_as_link(url=url, link_type=link_type, name=name))


def issue(url, name=None):
    return link(url, link_type=LinkType.ISSUE, name=name)


def testcase(url, name=None):
    return link(url, link_type=LinkType.TEST_CASE, name=name)

出现三个装饰器的原因是为了更好地将链接分类访问连接Bug链接测试用例链接

6.1.6 BDD标记装饰器

    在pytest中,可以使用@pytest.mark进行标识,但并不会显示在allure报告上,而allure也提供了三种类型的标记装饰器,它们则是可以显示在allure报告上的,如下所示:

1.story 是 feature 的子集,当测试用例有 @allure.feature、@allure.story 时,在报告上会先显示 feature,点开之后再显示 story

2.如果不加 @allure.feature、@allure.story 时,在Behaviors栏目下,测试用例都不会分类显示

    用命令行方式运行时,可以指定运行某个story、feature、epic

--allure-epics
--allure-features
--allure-stories

6.1.7 @allure.severity

    allure提供了用例级别,因此在allure报告可以清晰看到不同级别用例的缺陷数量。详细等级如下所示:

级别 含义 详细解释
blocker 阻塞缺陷 无法执行下一步操作等
critical 严重缺陷 功能点缺失或直接崩溃等
normal 一般缺陷 边界值问题,格式错误等
minor 次要缺陷 UI类错误等
trivial 轻微缺陷 必填项无提示或提示信息不规范和统一等

6.2 Allure和Pytest安装

    执行以下命令安装即可:

pip install -U allure-pytest pytest

6.3 Allure与Pytest集成示例

6.3.1 allure.step示例

    示例代码如下所示:

import pytest
import allure
import os

@allure.step("这是第一步")
def inputUrl(url:str):
    print(f"输入的网址为:{url}")

@allure.step(title="这是第二步")
def locateElement(xpath:str):
    print(f"查找元素的xpath是{xpath}")

@allure.step("这是第三步")
def sendElement():
    inputUsernameAndPasswd("Surpass","password")

@allure.step("这是第四步,{username},{password}")
def inputUsernameAndPasswd(username:str,password:str):
    print(f"输入的用户名和密码分别为:{username},{password}")

@allure.step("这是第五步")
def test_login():
    inputUrl("https://www.baidu.com")
    locateElement('//*[@id="su"]')
    sendElement()

    生成结果如下所示:

01allure.step.png

6.3.2 allure.attach示例

    示例代码如下所示:

import pytest
import allure
import os

def attach01(body,name,attachment_type=allure.attachment_type.TEXT):
    """
    附件为内容
    """
    allure.attach(body,name,attachment_type=attachment_type)

def attach02(filePath,name,attachment_type=allure.attachment_type.TEXT):
    """
    附件为文件
    """
    allure.attach.file(filePath,name,attachment_type=attachment_type)

def test_attach01():
    body = "<h3>方法一:测试allure附件内容为HTML</h3>"
    name = "attach-01-test"
    attach01(body,name,attachment_type=allure.attachment_type.HTML)


def test_attach02():
    filePath=os.path.join(os.getcwd(),"attach","sample.png")
    name="attach-02-test"
    attach02(filePath,name,attachment_type=allure.attachment_type.PNG)

    生成结果如下所示:

02allure.attach.png

6.3.3 allure.description示例

    示例代码如下所示:

import pytest
import allure


def test_allureDescription01():
    """这是一个allure.description示例01"""
    assert (7+8)==15

@allure.description("这是一个allure.description示例02")
def test_allureDescription02():
    assert (7+8)==15

@allure.description_html("""
  <h2>这是一个
    <font size=15>allure.description </font>示例03
   </h2>
  """)
def test_allureDescription03():
    assert (7+8)==15

    生成结果如下所示:

03allure.description.png

6.3.4 allure.title示例

    示例代码如下所示:

import pytest
import allure

@allure.title("登录")
@pytest.fixture(scope="session")
def loginData(request):
    params=request.param
    name=params.get("name","")
    password=params.get("password","")
    code=params.get("code","")
    print(f"param is {name},{password},{code}")
    yield name,password,code

@allure.title(f"登录成功")
@pytest.mark.parametrize("loginData",[
    {"name":"Surpass","password":"123456","code":"SHCQ"},
    {"name":"Diana","password":"20210227","code":"FKDT"}
  ],indirect=True)
def test_loginSucces(loginData):
    name,password,code=loginData
    body=f"用户名:{name},密码:{password},验证码:{code}"
    name="allure.title.test"
    allure.attach(body,name,attachment_type=allure.attachment_type.TEXT)

    生成结果如下所示:

04allure.title.png

6.3.5 allure.link&allure.issue&allure.testcase示例

    示例代码如下所示:

import pytest
import allure


@allure.link("https://www.google.com")
def test_basicLink():
    pass

@allure.link(url="https://www.surpassme.com",name="basicLink")
def test_basicLinkWithName():
    pass

@allure.issue(url="https://www.baidu.com",name="issueLink")
def test_issueLink():
    pass

@allure.testcase(url="https://www.zentao.net",name="testcaseLink")
def test_testcaseLink():
    pass

    生成结果如下所示:

05allute.link.png

6.3.6 BDD标记装饰器示例

    示例代码如下所示:

import pytest
import allure

@allure.step("第一步")
def firstStep():
    print("这是第一步")

@allure.step("第二步")
def secondStep():
    print("这是第二步")

@allure.step("第N步")
def nStep():
    print("第N步")

@allure.epic("总体描述")
@allure.feature("测试模块A")
class TestEpicAndFeatureAndStory():
    @allure.issue("http://www.surpamssme.com/issue/id=0227")
    @allure.testcase("http://www.surpassme.com/testcase/id=0227")
    @allure.title("功能A-用例-01")
    @allure.story("测试功能A")
    @allure.description("Surpassme 测试验证")
    def test_CaseA01(self):
        print("test_Case01")
        firstStep()
        secondStep()

    @allure.story("测试功能A")
    @allure.title("功能A-用例-02")
    def test_CaseA02(self):
        pass

    @allure.story("测试功能A")
    @allure.title("功能A-用例-03")
    def test_CaseA03(self):
        pass

    @allure.story("测试功能B")
    @allure.title("功能B用例-01")
    def test_CaseB01(self):
        pass

    @allure.story("测试功能B")
    @allure.title("功能B用例-03")
    def test_CaseB02(self):
        pass

    生成结果如下所示:

06allute.epic-feature-story.png

6.3.7 allure.severity

    示例代码如下所示:

import allure

@allure.title("blocker")
@allure.severity("blocker")
def test_Case01():
    pass

@allure.title("critical")
@allure.severity("critical")
def test_Case02():
    pass

@allure.title("normal")
@allure.severity("normal")
def test_Case03():
    pass

@allure.title("minor")
@allure.severity("minor")
def test_Case04():
    pass

@allure.title("trivial")
@allure.severity("trivial")
def test_Case05():
    pass

    生成结果如下所示:

07allure.severity.png
上一篇下一篇

猜你喜欢

热点阅读