测试报告工作要求:安装部署、默认报告、定制报告
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'])
问题
怎么每次对脚本去生成测试报告,之前的测试报告可以不用删除掉