• 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.测试通过、测试失败、测试跳过、测试警告

    1. # 测试通过、测试失败、测试跳过、测试警告
    2. import pytest
    3. def test_success():
    4. """this test succeeds"""
    5. assert True
    6. def test_failure():
    7. """this test fails"""
    8. assert False
    9. def test_skip():
    10. """this test is skipped"""
    11. pytest.skip('for a reason!')
    12. def test_broken():
    13. raise Exception('oops')

    2.关联关系scope_step

    1. import pytest
    2. import allure
    3. def function_scope_step():
    4. print("function_scope_step")
    5. def class_scope_step():
    6. print("class_scope_step")
    7. def module_scope_step():
    8. print("module_scope_step")
    9. def session_scope_step():
    10. print("session_scope_step")
    11. def step_inside_test_body():
    12. print("step_inside_test_body")
    13. @pytest.fixture(params=[True, False], ids=['param_true', 'param_false'])
    14. def function_scope_fixture_with_finalizer(request):
    15. if request.param:
    16. print('True')
    17. else:
    18. print('False')
    19. def function_scope_finalizer():
    20. function_scope_step()
    21. request.addfinalizer(function_scope_finalizer)
    22. @pytest.fixture(scope='class')
    23. def class_scope_fixture_with_finalizer(request):
    24. def class_finalizer_fixture():
    25. class_scope_step()
    26. request.addfinalizer(class_finalizer_fixture)
    27. @pytest.fixture(scope='module')
    28. def module_scope_fixture_with_finalizer(request):
    29. def module_finalizer_fixture():
    30. module_scope_step()
    31. request.addfinalizer(module_finalizer_fixture)
    32. @pytest.fixture(scope='session')
    33. def session_scope_fixture_with_finalizer(request):
    34. def session_finalizer_fixture():
    35. session_scope_step()
    36. request.addfinalizer(session_finalizer_fixture)
    37. class TestClass(object):
    38. def test_with_scoped_finalizers(self,
    39. function_scope_fixture_with_finalizer,
    40. class_scope_fixture_with_finalizer,
    41. module_scope_fixture_with_finalizer,
    42. session_scope_fixture_with_finalizer):
    43. step_inside_test_body()

    3.story和feature

    如果要想看测试用例执行了几组内容,可以在测试用例上加上allure.story做一个说明,这样你每一个
    测试用例或者测试方法执行后,就会在概要的地方出来相关的名称,点开名称看到具体相关内容,多了索引这样的一项功能
    1. import allure
    2. def test_without_any_annotations_that_wont_be_executed():
    3. pass
    4. @allure.story('epic_1')
    5. def test_with_epic_1():
    6. pass
    7. @allure.story('story_1')
    8. def test_with_story_1():
    9. pass
    10. @allure.story('story_2')
    11. def test_with_story_2():
    12. pass
    13. @allure.feature('feature_2')
    14. @allure.story('story_2')
    15. def test_with_story_2_and_feature_2():
    16. pass

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

    1. import allure
    2. def test_with_no_severity_label():
    3. pass
    4. @allure.severity(allure.severity_level.TRIVIAL)
    5. def test_with_trivial_severity():
    6. assert False
    7. @allure.severity(allure.severity_level.NORMAL)
    8. def test_with_normal_severity():
    9. assert False
    10. @allure.severity(allure.severity_level.NORMAL)
    11. class TestClassWithNormalSeverity(object):
    12. def test_inside_the_normal_severity_test_class(self):
    13. pass
    14. @allure.severity(allure.severity_level.CRITICAL)
    15. def test_inside_the_normal_severity_test_class_with_overriding_critical_severity(self):
    16. pass

    5.step

    有step这个标签可以看到测试用例的内容看到参数的传递,会更详细一些。只执行test打头的方法,其他方法是隶属于test_ 方法的一个步骤
    1. # 这个用户自己建立的包,不是一个类库,为了不影响使用,注释掉
    2. # from .steps import imported_step
    3. @allure.step
    4. def passing_step():
    5. pass
    6. @allure.step
    7. def step_with_nested_steps():
    8. nested_step()
    9. @allure.step
    10. def nested_step():
    11. nested_step_with_arguments(1, 'abc')
    12. @allure.step
    13. def nested_step_with_arguments(arg1, arg2):
    14. pass
    15. def test_with_imported_step():
    16. passing_step()
    17. # imported_step()
    18. def test_with_nested_steps():
    19. passing_step()
    20. step_with_nested_steps()

    6.feature和module

    feature可以当做是测试套的概念,一个业务里面包含多个测试方法,可以把module当做是业务
    moudle里面的当做是测试方法,这样子的层次会比较明显
    1. import allure
    2. import pytest
    3. @allure.feature('test_module_01')
    4. def test_case_01_01():
    5. assert 0
    6. @allure.feature('test_module_01')
    7. def test_case_01_02():
    8. assert 1
    9. @allure.feature('test_module_02')
    10. def test_case_02_01():
    11. assert 0==0
    12. @allure.feature('test_module_02')
    13. def test_case_02_02():
    14. assert 0==1
    15. if __name__ == '__main__':
    16. pytest.main(['test_allure_example6.py','-s','-q','--alluredir','./tmp/report'])

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

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

    1. import pytest
    2. import allure
    3. @allure.feature("usermanage")
    4. class Test_Django():
    5. @allure.story("adduser")
    6. @allure.step("登录的步骤")
    7. def test_login(self):
    8. print("登录")
    9. @allure.story("adduser")
    10. @allure.step("添加用户的步骤")
    11. def test_adduser(self):
    12. print("添加用户")
    13. @allure.story("updateuser")
    14. @allure.step("修改用户的步骤")
    15. def test_updateuser(self):
    16. print("修改用户信息")
    17. @allure.story("deluser")
    18. @allure.step("删除用户的步骤")
    19. def test_deluser(self):
    20. print("删除用户")
    21. if __name__ == '__main__':
    22. pytest.main(['test_allure_example7.py','-s','-q','--alluredir','./tmp/report'])

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

    # 不加title标签,默认出现的测试方法名称
    # 加了title,就不是显示测试方法名,显示的是标签title的内容
    # 加了description会在详情页面展示,一个是标题一个是详情
    1. import pytest,allure
    2. @allure.title("这是@allure.title标签")
    3. def test_title():
    4. assert 1
    5. @allure.description("这是@allure.title标签")
    6. def test_description():
    7. assert 42 ==int(6*7)
    8. if __name__ == '__main__':
    9. pytest.main(['test_allure_example8.py','-s','-q','--alluredir','./tmp/report1'])

    9.链接标签

    1. # 下面的这三个标签,建议只要用第一个标签就好
    2. import pytest,allure
    3. @allure.link("www.baidu.com")
    4. @allure.testcase("www.baidu.com")
    5. @allure.issue("www.baidu.com")
    6. def test_case():
    7. assert 1
    8. if __name__ == '__main__':
    9. pytest.main(['test_allure_example9.py','-s','-q','--alluredir','./tmp/report2'])

    10.attach、添加测试图片

     #测试用例以图片的形式展示出来,会明显的知道,当前执行的是哪条测试用例
    # 可以帮助测试执行的人或者查看测试报告的人了解测试进度
    1. import csv
    2. import time
    3. import pytest
    4. import allure
    5. from selenium import webdriver
    6. # 1、创建测试类
    7. class Test_Django_Login():
    8. # 2、创建测试方法
    9. # 正常登录测试方法:用户名不存在
    10. # 登录初始化
    11. def setup_method(self):
    12. self.url="http://testplt.share.atstudy.com/admin/login/?next=/admin/"
    13. self.driver=webdriver.Chrome()
    14. self.driver.get(self.url)
    15. # 正常登录测试方法
    16. def test_login_01(self):
    17. f=open('logindata.csv','r')
    18. rows=csv.reader(f)
    19. for row in rows:
    20. print(row[0])
    21. self.driver.find_element_by_name('username').send_keys(row[0])
    22. self.driver.find_element_by_name('password').send_keys(row[1])
    23. self.driver.find_element_by_xpath('//*[@id="login-form"]/div[3]/input').click()
    24. # 检查点
    25. result=self.driver.current_url
    26. print(result)
    27. if row[2]=="1":
    28. assert result !=self.url
    29. else:
    30. assert result ==self.url
    31. time.sleep(1)
    32. self.driver.find_element_by_name('username').clear()
    33. self.driver.find_element_by_name('password').clear()
    34. with open(file="testdata_login.jpg",mode="rb") as f:
    35. file =f.read()
    36. allure.attach(body=file,name="登录测试数据",attachment_type=allure.attachment_type.JPG)
    37. def teardown_method(self):
    38. self.driver.quit()
    39. if __name__ == '__main__':
    40. pytest.main(['test_allure_example11.py','-s','-q','--alluredir','./tmp/report'])

    问题

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

  • 相关阅读:
    Dokcer管理工具——Lazydocker的部署和基本使用
    PTA 1065 单身狗(Python3)
    css文本划线效果(text-decoration相关属性详解)
    1921. 消灭怪物的最大数量
    海外问卷调查加盟可靠吗?
    Java实现发送Get、Post请求仅需两步
    Oauth2系列6:隐式模式
    Multi-Graph Fusion Networks for Urban Region Embedding
    大数据技术之Shell学习笔记(常用)
    MySQL事务与存储引擎相关设置
  • 原文地址:https://blog.csdn.net/weixin_47547541/article/details/126789919