pytest-allure测试报告应用和实践

测试报告工作要求:安装部署、默认报告、定制报告

allure官网:https://docs.qameta.io/allure/

一、环境安装:

类库安装:cmd上pip install allure-pytest或者pycharm里面setting安装

java环境:jdk、环境变量

allure安装包:压缩包下载、环境便令、验证方法:cmd上allure--version

二、默认报告

如果安装出现一些问题,不一定要按照官网,可以结合老师给的安装文档,官网可以学习一些学习方法

1.生成测试报告需要的数据,并指定存放路径

pytest --alluredir=./tmp/my_allure_results

2.生成测试报告

这个命令是只能看到报告,只是临时看一下

allure serve ./tmp/my_allure_results

3.想创建一个报告,可以用这个命令

allure generate ./tmp/my_allure_results

4.在终端运行

5.mian方法运行(-q是只显示整体测试结果)

pytest.main(['脚本名.py','-s','-q','--alluredir','./tmp/report1'])

assert0默认的就是失败的一个常量

定制测试报告内容,allure提供的测试报告还是非常丰富的

三、allure报告相关设置

注意:

官方文档对我们既有帮助也有误导,大家一定要在学习的时候,把眼睛睁大一点,来进行适当的调整,
来进行学习,不同的标签对我们测试报告的影响是不一样上的,未来可能还会使用其他的标签,也可以去扩展,官方里提供给我们的内容还是比较多的,有时间可以做个逐步的试验,和我们的报告结合起来,有些代码就需要追加说明,有代码需要注释掉,因为文档本身可能存在一些缺陷。怎么把他结合在框架里面进行一个设计

1.测试通过、测试失败、测试跳过、测试警告

# 测试通过、测试失败、测试跳过、测试警告
import pytest

def test_success():
    """this test succeeds"""
    assert True


def test_failure():
    """this test fails"""
    assert False


def test_skip():
    """this test is skipped"""
    pytest.skip('for a reason!')


def test_broken():
    raise Exception('oops')

2.关联关系scope_step

import pytest
import allure


def function_scope_step():
    print("function_scope_step")
def class_scope_step():
    print("class_scope_step")
def module_scope_step():
    print("module_scope_step")
def session_scope_step():
    print("session_scope_step")
def step_inside_test_body():
    print("step_inside_test_body")

@pytest.fixture(params=[True, False], ids=['param_true', 'param_false'])
def function_scope_fixture_with_finalizer(request):
    if request.param:
        print('True')
    else:
        print('False')
    def function_scope_finalizer():
        function_scope_step()
            
    request.addfinalizer(function_scope_finalizer)


@pytest.fixture(scope='class')
def class_scope_fixture_with_finalizer(request):
    def class_finalizer_fixture():
        class_scope_step()
    request.addfinalizer(class_finalizer_fixture)


@pytest.fixture(scope='module')
def module_scope_fixture_with_finalizer(request):
    def module_finalizer_fixture():
        module_scope_step()
    request.addfinalizer(module_finalizer_fixture)


@pytest.fixture(scope='session')
def session_scope_fixture_with_finalizer(request):
    def session_finalizer_fixture():
        session_scope_step()
    request.addfinalizer(session_finalizer_fixture)


class TestClass(object):

    def test_with_scoped_finalizers(self,
                                    function_scope_fixture_with_finalizer,
                                    class_scope_fixture_with_finalizer,
                                    module_scope_fixture_with_finalizer,
                                    session_scope_fixture_with_finalizer):
        step_inside_test_body()

3.story和feature

如果要想看测试用例执行了几组内容,可以在测试用例上加上allure.story做一个说明,这样你每一个
测试用例或者测试方法执行后,就会在概要的地方出来相关的名称,点开名称看到具体相关内容,多了索引这样的一项功能
import allure

def test_without_any_annotations_that_wont_be_executed():
    pass


@allure.story('epic_1')
def test_with_epic_1():
    pass


@allure.story('story_1')
def test_with_story_1():
    pass

@allure.story('story_2')
def test_with_story_2():
    pass


@allure.feature('feature_2')
@allure.story('story_2')
def test_with_story_2_and_feature_2():
    pass

4.严重性标记,测试用例执行通过或者失败,它对应有严重缺陷级别的说明

import allure

def test_with_no_severity_label():
    pass


@allure.severity(allure.severity_level.TRIVIAL)
def test_with_trivial_severity():
    assert False


@allure.severity(allure.severity_level.NORMAL)
def test_with_normal_severity():
    assert False

@allure.severity(allure.severity_level.NORMAL)
class TestClassWithNormalSeverity(object):

    def test_inside_the_normal_severity_test_class(self):
        pass

    @allure.severity(allure.severity_level.CRITICAL)
    def test_inside_the_normal_severity_test_class_with_overriding_critical_severity(self):
        pass

5.step

有step这个标签可以看到测试用例的内容看到参数的传递,会更详细一些。只执行test打头的方法,其他方法是隶属于test_ 方法的一个步骤
# 这个用户自己建立的包,不是一个类库,为了不影响使用,注释掉
# from .steps import imported_step
@allure.step
def passing_step():
    pass

@allure.step
def step_with_nested_steps():
    nested_step()


@allure.step
def nested_step():
    nested_step_with_arguments(1, 'abc')


@allure.step
def nested_step_with_arguments(arg1, arg2):
    pass


def test_with_imported_step():
    passing_step()
    # imported_step()


def test_with_nested_steps():
    passing_step()
    step_with_nested_steps()

6.feature和module

feature可以当做是测试套的概念,一个业务里面包含多个测试方法,可以把module当做是业务
moudle里面的当做是测试方法,这样子的层次会比较明显
import allure
import pytest

@allure.feature('test_module_01')
def test_case_01_01():
    assert 0
@allure.feature('test_module_01')
def test_case_01_02():
    assert 1
@allure.feature('test_module_02')
def test_case_02_01():
    assert 0==0
@allure.feature('test_module_02')
def test_case_02_02():
    assert 0==1
if __name__ == '__main__':
    pytest.main(['test_allure_example6.py','-s','-q','--alluredir','./tmp/report'])

7.feature和step和story的关系结合运用

# 把类当做一个测试套 # feature是测试套 # story可以认为是一个场景,一个方法 # 一个story可以包含多个方法,也可以一个story对应一个测试方法 # story里面可以有多个步骤step,也可以一个story对应一个步骤step,可以加步骤说明

import pytest
import allure

@allure.feature("usermanage")
class Test_Django():

    @allure.story("adduser")
    @allure.step("登录的步骤")
    def test_login(self):
        print("登录")

    @allure.story("adduser")
    @allure.step("添加用户的步骤")
    def test_adduser(self):
        print("添加用户")

    @allure.story("updateuser")
    @allure.step("修改用户的步骤")
    def test_updateuser(self):
        print("修改用户信息")

    @allure.story("deluser")
    @allure.step("删除用户的步骤")
    def test_deluser(self):
        print("删除用户")
if __name__ == '__main__':
    pytest.main(['test_allure_example7.py','-s','-q','--alluredir','./tmp/report'])

8.title和description,提升测试报告的易读性

# 不加title标签,默认出现的测试方法名称
# 加了title,就不是显示测试方法名,显示的是标签title的内容
# 加了description会在详情页面展示,一个是标题一个是详情
import pytest,allure

@allure.title("这是@allure.title标签")
def test_title():
    assert 1
@allure.description("这是@allure.title标签")
def test_description():
    assert 42 ==int(6*7)

if __name__ == '__main__':
    pytest.main(['test_allure_example8.py','-s','-q','--alluredir','./tmp/report1'])

9.链接标签


# 下面的这三个标签,建议只要用第一个标签就好
import pytest,allure
@allure.link("www.baidu.com")
@allure.testcase("www.baidu.com")
@allure.issue("www.baidu.com")

def test_case():
    assert 1

if __name__ == '__main__':
    pytest.main(['test_allure_example9.py','-s','-q','--alluredir','./tmp/report2'])

10.attach、添加测试图片

 #测试用例以图片的形式展示出来,会明显的知道,当前执行的是哪条测试用例
# 可以帮助测试执行的人或者查看测试报告的人了解测试进度
import csv
import time
import pytest
import allure
from selenium import webdriver

# 1、创建测试类
class Test_Django_Login():
    # 2、创建测试方法
    #   正常登录测试方法:用户名不存在
    #   登录初始化
    def setup_method(self):
        self.url="http://testplt.share.atstudy.com/admin/login/?next=/admin/"
        self.driver=webdriver.Chrome()
        self.driver.get(self.url)
    # 正常登录测试方法
    def test_login_01(self):
        f=open('logindata.csv','r')
        rows=csv.reader(f)
        for row in rows:
            print(row[0])
            self.driver.find_element_by_name('username').send_keys(row[0])
            self.driver.find_element_by_name('password').send_keys(row[1])
            self.driver.find_element_by_xpath('//*[@id="login-form"]/div[3]/input').click()
            # 检查点
            result=self.driver.current_url
            print(result)
            if row[2]=="1":
                assert  result !=self.url
            else:
                assert result ==self.url
                time.sleep(1)
                self.driver.find_element_by_name('username').clear()
                self.driver.find_element_by_name('password').clear()
        with open(file="testdata_login.jpg",mode="rb") as f:
            file =f.read()
            allure.attach(body=file,name="登录测试数据",attachment_type=allure.attachment_type.JPG)

    def teardown_method(self):
        self.driver.quit()

if __name__ == '__main__':
    pytest.main(['test_allure_example11.py','-s','-q','--alluredir','./tmp/report'])

问题

怎么每次对脚本去生成测试报告,之前的测试报告可以不用删除掉

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值