测试报告工作要求:安装部署、默认报告、定制报告
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提供的测试报告还是非常丰富的
注意:
官方文档对我们既有帮助也有误导,大家一定要在学习的时候,把眼睛睁大一点,来进行适当的调整, 来进行学习,不同的标签对我们测试报告的影响是不一样上的,未来可能还会使用其他的标签,也可以去扩展,官方里提供给我们的内容还是比较多的,有时间可以做个逐步的试验,和我们的报告结合起来,有些代码就需要追加说明,有代码需要注释掉,因为文档本身可能存在一些缺陷。怎么把他结合在框架里面进行一个设计
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'])
问题
怎么每次对脚本去生成测试报告,之前的测试报告可以不用删除掉