目录:导读
- 前言
- 一、Python编程入门到精通
- 二、接口自动化项目实战
- 三、Web自动化项目实战
- 四、App自动化项目实战
- 五、一线大厂简历
- 六、测试开发DevOps体系
- 七、常用自动化测试工具
- 八、JMeter性能测试
- 九、总结(尾部小惊喜)
前言
Allure框架
Allure 框架是一个灵活的、轻量级的、支持多语言的测试报告工具,它不仅以 Web 的方式展示了简介的测试结果,而且允许参与开发过程的每个人可以从日常执行的测试中,最大限度地提取有用信息。
安装
Windows/Mac 通用安装方法:
下载地址:https://github.com/allure-framework/allure2/releases,下载所需版本的 zip 包。
安装:
解压 —> 进入 bin 目录 —> 运行 allure.bat
把 bin 目录加入 Path 环境变量
配合 pytest,使用 allure2 生成更加精美的测试报告:pip install allure-pytest
运行方法
在测试执行期间收集结果
pytest [测试文件] -s -q --alluredir=./result/ --clean-alluredir
-s:表示将执行成功的案例日志打印出来
-q:若跟文件执行路径则代表只需要执行的文件
–alluredir:指定存储测试结果的路径(若目录不存在则会新建)
–clean-alluredir:清除历史结果数据
查看测试报告
方式一:用于在本地渲染后对外展示结果
allure serve ./result/
方式二:用于在本地渲染和查看结果
# 生成报告
allure generate ./result/ -o ./report/ --clean # 注意:覆盖路径加 --clean
# 打开报告
allure open -h 127.0.0.1 -p 8883 ./report/
注意:
/report/ 目录中的 index.html 就是最终的结果页面,但直接通过浏览器打开这个文件是看不到实际报告内容的,这是因为实际报告内容需要 allure 进行渲染后才能看到。
Allure 常用特性
场景:
希望在报告中看到测试功能,子功能或场景,测试步骤,包括测试附加信息。
解决:
import allure
@allure.feature(‘功能名称’)
@allure.story(‘子功能名称’)
@allure.title(‘测试用例名称’)
@allure.step(‘步骤细节’)
@allure.description(‘测试用例描述’)
@allure.attach(‘具体文本信息’):需要附加的信息,可以是数据,文本,图片,视频,网页
如果只测试登录功能运行的时候可以加限制过滤,如:pytest 文件名 --allure_features ‘购物车功能’ --allure_stories ‘加入购物车’
@alllure.feature() 与 @allure.store() 的关系
feature 相当于一个大的功能或模块。将 case 分类到某个 feature 中,并在报告中的 behaviors 中显示,相当于 testsuite。
story 相当于分支功能/模块,属于 feature 之下的结构,并在报告中的 features 中显示,相当于 testcase。
feature 与 story 类似于父子关系。
@allure.step() 与 with allure.step() 的区别
测试过程中每个步骤,一般放在具体逻辑方法中。
可以放在关键步骤中,在报告中显示。
在 App、Web 自动化测试当中,建议每切换到一个新的页面当做一个 step。
用法:
@allure.step():只能以装饰器的形式放在类或者方法上。
with allure.step():可以放在测试用例方法里面,但测试步骤的代码需要被该语句包含。
给测试用例划分优先级
场景:
通常测试有冒烟测试、回归测试、线上验证测试等,那么就需要按照重要性级别来分别执行,比如上线时要把主流程和重要模块都跑一遍。
解决:
通过附加 pytest.mark 标记描述
通过 allure.feature、allure.story 标记描述
通过 allure.severity 直接标记用例级别
根据测试用例的重要性划分测试用例等级,如果没指定等级,默认为 NORMAL 级别:
BLOCKER:阻塞缺陷(功能未实现,无法下一步)
CRITICAL:严重缺陷(功能点缺失)
NORMAL:一般缺陷(边界情况,格式错误)
MINOR:次要缺陷(界面错误与ui需求不符)
TRIVIAL:轻微缺陷(必须项无提示,或者提示不规范)
步骤:
在方法、函数和类上面加:@allure.severity(allure.severity_level.TRIVIAL)
指定执行对应级别的用例:pytest -s -v 文件名 --allure-severities normal, critical
Allure 测试报告添加内容(图片、附件、文本、截图、HTML 等)
场景:
前端自动化测试经常需要附加图片或 html,比如在适当的地方、适当的时机截图等。
解决:
@allure.attach() 显示许多不同类型的提供的附件,可以补充测试、步骤或测试结果。
步骤:
在测试报告里附加网页:
格式:allure.attach(body(内容), name, attachment_typeextension)
示例:allure.attach(‘/head>首页’, ‘这是错误页的结果信息’, allure.attachment_type.HTML)
在测试报告里附加图片:
格式:allure.attach.file(source, name, attachment_type, extension)
示例:allure.attach.file(“./result/b.png”, attachment_type=allure.attachment_type.PNG)
集成测试管理系统
@allure.link()、@allure.issue()、@allure.testcase() 主要是为了将 Allure 报告和测试管理系统集成,可以更快速地跳转到公司内部地址。
先看看三个装饰器的源码:
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)
小结:
issue() 和 testcase() 其实调用的也是 link(),只是 link_type 不一样。
必传参数 url:跳转的链接。
可选参数 name:显示在 Allure 报告的名字,如果不传就是显示完整的链接(建议传,不然可读性不高)。
可以理解成:三个方法是一样的,我们都提供跳转链接和名字,只是链接的 type 不一样,最终显示出来的样式不一样而已(type 不一样,样式不一样)。
如果你喜欢,只用 @allure.link() 也可以。
而出现三个装饰器的原因是为了更好地将链接进行分类(访问链接、Bug 链接、测试用例链接)。
import allure
TEST_CASE_LINK = 'https://github.com/qameta/allure-integrations/issues/8#issuecomment-268313637'
@allure.link('https://www.youtube.com/watch?v=4YYzUTYZRMU')
def test_with_link():
pass
@allure.link('https://www.youtube.com/watch?v=Su5p2TqZxKU', name='点击我看一看youtube吧')
def test_with_named_link():
pass
@allure.issue('140', 'bug issue链接')
def test_with_issue_link():
pass
@allure.testcase(TEST_CASE_LINK, '测试用例地址')
def test_with_testcase_link():
pass
接口自动化测试框架示例
测试方法示例
import pytest
import allure
import logging
from util.assert_util import assert_keyword
from util.request_util import api_request
from util.global_var import *
from util.excel_util import excel_util
register_test_data = excel_util.get_sheet_data("注册")
login_test_data = excel_util.get_sheet_data("登录")
@allure.feature("登录模块")
@pytest.mark.dependency(name="TestLoginModule")
class TestLoginModule:
@allure.story("注册功能")
@allure.title('用户注册') # 指定测试用例标题,默认是函数名
@allure.description('通过接口进行用户注册') # 添加测试用例描述
@allure.severity(allure.severity_level.BLOCKER) # 阻塞级别
@pytest.mark.run(order=1)
@pytest.mark.parametrize('case_data', register_test_data)
def test_register(self, case_data):
with allure.step("读取请求数据,调用接口"):
logging.info("接口用例数据:%s" % case_data)
response = api_request(case_data[API_IP], case_data[API_URI], case_data[REQUEST_METHOD],
case_data[API_REQUEST_DATA], case_data[RESPONSE_EXTRACT_VAR],
case_data[REQUEST_HEADER], case_data[REQUEST_COOKIE])
with allure.step("获取响应数据,进行断言"):
assert_keyword(response, case_data[RESPONSE_ASSERT_KEYWORD])
@allure.story("登录功能")
@allure.title('用户登录') # 指定测试用例标题,默认是函数名
@allure.description('通过接口进行用户登录') # 添加测试用例描述
@allure.severity(allure.severity_level.BLOCKER) # 阻塞级别
@pytest.mark.run(order=2)
@pytest.mark.parametrize('case_data', login_test_data)
def test_login(self, case_data):
with allure.step("读取请求数据,调用接口"):
logging.info("接口用例数据:%s" % case_data)
response = api_request(case_data[API_IP], case_data[API_URI], case_data[REQUEST_METHOD],
case_data[API_REQUEST_DATA], case_data[RESPONSE_EXTRACT_VAR],
case_data[REQUEST_HEADER], case_data[REQUEST_COOKIE])
with allure.step("获取响应数据,进行断言"):
assert_keyword(response, case_data[RESPONSE_ASSERT_KEYWORD])
if __name__ == "__main__":
test_dir = os.path.dirname(__file__)
pytest.main(['-s', '-q', test_dir, '--alluredir', '../test_result/', "--clean-alluredir"])
os.system('allure generate ../test_result/ -o ../test_report/ --clean')
os.system('allure open -h 127.0.0.1 -p 8881 ../test_report/')
测试数据示例
Allure 报告结果示例
下面是我整理的2023年最全的软件测试工程师学习知识架构体系图 |
一、Python编程入门到精通
二、接口自动化项目实战
三、Web自动化项目实战
四、App自动化项目实战
五、一线大厂简历
六、测试开发DevOps体系
七、常用自动化测试工具
八、JMeter性能测试
九、总结(尾部小惊喜)
人生如一场马拉松,不在乎起点,只看终点。坚持奋斗的脚步,才能追逐成功的光芒。每一次努力都是积累,每一次挑战都是成长,相信自己的潜力,勇往直前,创造属于自己的辉煌人生。
不论路途多么艰辛,只要保持初心与激情,努力奋斗便能超越自我,征服一切困难。相信自己的潜力与可能,勇敢冲破束缚,开启属于自己的辉煌篇章,绽放耀眼的人生光芒。
每一步努力,都是离成功更近一步的勇敢挑战;每一次奋斗,都是追求梦想的不懈追逐。不论遇到多少困难与阻碍,心怀坚定信念,毅然前行,终将创造出属于自己的辉煌人生,展现真正的自我价值。