1、测试识别和运行
文件识别:
-
在给定的目录中,搜索所有test_.py或者_test.py文件
用例识别:
-
Test*类包含的所有test_*的方法(测试类不能有__init__方法)
-
不在类中的所有test_*方法
-
pytest也能执行unit test写的用例和方法
运行方式
1、pycharm页面修改默认的测试运行方式
settings页面,输入pytest,修改Default test runner
2、右键执行python文件
3、命令行界面执行,点击pycharm下方的terminal,打开命令行界面,执行pytest 命令
4、pycharm代码边界界面,左侧单条用例运行按钮
5、主函数运行方式
在运行文件中编写主函数,主函数启动需要导入pytest包,不然找不到pytest方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
import
pytest
class
TestClass:
def
test_one(
self
):
x
=
"this"
assert
"h"
in
x
def
test_two(
self
):
x
=
"hello"
assert
hasattr
(x,
"check"
)
if
__name__
=
=
'__main__'
:
# pytest.main()
pytest.main(
"test_study.py"
)
|
pytest.main()会自动读取当前目录下的所有test开头的.py文件,运行test方法或者类
可以传入不同的参数,让运行更加定制化
1
2
3
4
5
6
7
8
|
pytest.main([
'./'
])
# 运行./目录下所有(test_*.py 和 *_test.py)
pytest.main ([
'./subpath1'
])
# 运行./subpath1 目录下用例
pytest.main ([
'./subpath1/test_module1.py'
])
# 运行指定模块
pytest.main ([
'./subpath1/test_module1.py::test_m1_1'
])
# 运行模块中的指定用例
pytest.main ([
'./subpath2/test_module2.py::TestM2::test_m2_02'
])
# 运行类中的指定用例
pytest.main ([
'-k'
,
'pp'
])
# 匹配包含pp的用例(匹配目录名、模块名、类名、用例名)
pytest.main([
'-k'
,
'spec'
,
'./subpath1/test_module1.py'
])
# 匹配test_module1.py模块下包含spec的用例
pytest.main([
'-k'
,
'pp'
,
'./subpath2/test_module2.py::TestM2'
])
# 匹配TestM2类中包含pp的用例
|
2、参数化
@pytest.mark.parametrize(argnames,argvalues)
-
argnames:要参数化的变量,可以是string(用逗号分割),list,tuple
-
argvalues:参数化的值,list[tuple],以列表形式传入元组,每个元组都是一条测试数据
-
ids,:默认为none,用来重新定义测试用例的名称
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
# 使用string分割参数化的变量
@pytest
.mark.parametrize(
'a,b'
,[(
10
,
20
),(
30
,
40
)])
def
test_param(a, b):
print
(a,b)
# 使用list分割参数化的变量
@pytest
.mark.parametrize([
'a'
,
'b'
],[(
10
,
20
),(
30
,
40
)])
def
test_param(a, b):
print
(a,b)
# 使用tuple分割参数化的变量
@pytest
.mark.parametrize((
'a'
,
'b'
),[(
10
,
20
),(
30
,
40
)])
def
test_param(a, b):
print
(a,b)
# 使用ids重新定义用例名称
@pytest
.mark.parametrize(
'a,b'
,[(
10
,
20
),(
30
,
40
)], ids
=
[
'case1'
,
'case2'
])
def
test_param(a, b):
print
(a,b)
|
yaml参数化
pip install PyYAML
yaml实现list
yaml实现字典
1
2
3
|
by: id
locator: name
action: click
|
yaml二维数组
1
2
3
4
5
6
7
8
9
10
11
12
|
companies:
- id: 1
name: company1
price: 200w
- id: 2
name: company2
price: 500w
fruites:
- name: 苹果
price: 8.6
- name: 香蕉
price: 2.6
|
读取yaml文件
yaml.safe_load(open(‘./data.yaml’))
3、测试报告美化-allure
1、操作系统内部先安装allure
2、安装allure-pytest插件
1
|
pip
install
allure-pytest
|
3、运行测试用例
查看pytest中allure相关的命令行参数
1
2
3
4
5
6
7
8
9
10
|
C:\Users\Administrator>pytest --help | findstr allure <== linux 使用
grep
过滤
--allure-severities=SEVERITIES_SET <== 根据用例级别过滤需要执行的用例
--allure-epics=EPICS_SET
--allure-features=FEATURES_SET <== 根据用例设置的feature名称过滤需要执行的用例
--allure-stories=STORIES_SET <== 根据用例设置的story名称过滤需要执行的用例
--allure-ids=IDS_SET Comma-separated list of IDs.
--allure-link-pattern=LINK_TYPE:LINK_PATTERN
--alluredir=DIR <== 指定存放用例执行结果的目录
--clean-alluredir 清除alluredir文件夹(如果存在)
--allure-no-capture Do not attach pytest captured logging
/stdout/stderr
to
|
4、执行测试命令
1
2
|
# --alluredir: 用于指定存储测试结果的路径
pytest [测试文件] -vs --alluredir=.
/result/
--clean-alluredir
|
5、查看测试报告
在线查看报告,直接打开默认浏览器展示当前报告
1
2
|
# 注意这里的serve书写,后面接用例执行结果(./result/:就是存放执行结果的目录路径)
allure serve ./result/
|
从结果生成报告
1.生成报告
1
2
|
# 注意:覆盖路径加--clean
allure generate .
/result/
-o .
/report/
--clean
|
2.打开报告
1
|
allure
open
-h 127.0.0.1 -p 8883 .
/report/
|
allure常用特性
支持在报告中查看测试功能、子功能或场景、测试步骤和测试附加信息等,可以通过@feature、@story、@step和@attach等装饰器实现
实现的步骤
-
import allure
-
功能上加@allure.feature(“功能名称”)
-
子功能上加@allure.story(“子功能名称”)
-
用例标题@allure.title(“用例名称”)
-
用例描述@allure.description(“用例描述”)
-
步骤上加@allure.step(“步骤细节”)
-
@allure.attach(“具体文本信息”),需要附加的信息,可以是数据、文本、图片、视频和网页
-
用例级别@allure.severity(级别)
-
如果只测试登录功能运行的时候,可以加限制过滤
1
2
3
|
# 注意这里--allure-features中间是-中线, 需要使用双引号
# 不能过滤--allure-features下的--allure-stories
pytest 文件名 --allure-features=
"登录模块"
|
-
feature相当于一个功能,一个大模块,将case分类到某个feature中,报告中Behaviors(功能中展示),相当于testsuite
-
story相当于这个功能或者模块下的不能场景,分支功能,属于feature之下的结构,报告中features中展示,详单与tescase
-
feature与story类似于父子关系
-
2、allure特性-step
-
测试过程中每个步骤,一般放在具体逻辑方法中
-
可以放在关步骤中,在报告中显示
-
在app、web自动化测试中,建议每切换到一个新页面就做一个step
-
用法:
-
@allure.step():只能以装饰器的形式放在类或者方法上面
-
with allure.step():可以放在测试用例方法里面,但是测试步骤代码需要被该语句包含
3、allure特性-testcase
关联测试用例,可以直接给测试用例的地址链接,一般用于关联手工测试用例
实力代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
import
pytest
import
allure
@allure
.feature(
'用户登录'
)
class
TestLogin:
@allure
.story(
'登录成功'
)
def
test_login_success(
self
):
with allure.step(
'步骤1:打开应用'
):
print
(
'打开应用'
)
with allure.step(
'步骤2:进入登录页面'
):
print
(
'进入登录页面'
)
with allure.step(
'步骤3:输入用户名和密码'
):
print
(
'输入用户名和密码'
)
print
(
'这是登录成功测试用例'
)
@allure
.story(
'登录失败'
)
def
test_login_fail(
self
):
print
(
'这是登录失败测试用例'
)
@allure
.story(
'登录失败'
)
@allure
.title(
'用户名缺失'
)
def
test_login_fail_a(
self
):
print
(
'这是登录失败测试用例'
)
@allure
.story(
'登录失败'
)
@allure
.testcase(
'https://www.baidu.com/'
,
'关联测试用例地址'
)
@allure
.title(
'密码缺失'
)
@allure
.description(
'这是一个用例描述信息'
)
def
test_login_fail_b(
self
):
with allure.step(
'点击用户名'
):
print
(
'输入用户名'
)
with allure.step(
'点击密码'
):
print
(
'输入密码'
)
print
(
'点击登录'
)
with allure.step(
'点击登录之后登录失败'
):
assert
'1'
=
=
1
|
按重要性级别 进行一定范围测试
通常测试用PO、冒烟测试、验证上线测试。按照重要性级别来分别执行
缺陷严重级别
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
1. Blocker级别——中断缺陷
客户端程序无响应,无法执行下一步操作。
2. Critical级别――临界缺陷,包括:
功能点缺失,客户端爆页。
3. Major级别——较严重缺陷,包括:
功能点没有满足需求。
4. Normal级别――普通缺陷,包括:
1. 数值计算错误
2. JavaScript错误。
5. Minor级别———次要缺陷,包括:
1. 界面错误与UI需求不符。
2. 打印内容、格式错误
3. 程序不健壮,操作未给出明确提示。
6. Trivial级别——轻微缺陷,包括:
1. 辅助说明描述不清楚
2. 显示格式不规范,数字,日期等格式。
3. 长时间操作未给用户进度提示
4. 提示窗口文字未采用行业术语
5. 可输入区域和只读区域没有明显的区分标志
6. 必输项无提示,或者提示不规范。
7. Enhancement级别——测试建议、其他(非缺陷)
1. 以客户角度的易用性测试建议。
2. 通过测试挖掘出来的潜在需求。
|
解决方法:
-
通过附加pytest.mark标记
-
通过allure.feature,allure.story
-
也可以通过allure.servity来附加标记
步骤:
在方法,函数和类上面加:
@allure.severity(allure.severity_level.TRIVIAL)
执行时过滤:
pytest -vs [文件名] --allure-severities normal, critical
前端自动化测试-截图
前端自动化测试经常需要附加图片或html,在适当的地方,适当时机截图
@allure.attach 实现不同类型附件,可以补充测试步骤或测试结果
使用方式:
1
2
|
allure.attach(body(内容), name, attachment_type, extension)
allure.attach(
'<body>这是一段html</body>'
,
'html测试'
, attachment_type
=
allure.attachment_type.HTML)
|
在测试报告附加图片
1
2
|
allure.attach.
file
(source, name, attachment_type, extension)
allure.attach.
file
(
'./123.jpg'
, name
=
'这是一个图片'
, attachment_type
=
allure.attachment_type.JPG)
|
示例代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
import
allure
def
test_attach_text():
allure.attach(
'这是一个纯文本'
, attachment_type
=
allure.attachment_type.TEXT)
def
test_attach_html():
allure.attach(
'<body>这是一段html</body>'
,
'html测试'
, attachment_type
=
allure.attachment_type.HTML)
def
test_attach_phote():
allure.attach.
file
(
'./123.jpg'
, name
=
'这是一个图片'
, attachment_type
=
allure.attachment_type.JPG)
def
test_attach_video():
allure.attach.
file
(
'./123.mp4'
,name
=
'这是一个视频'
,attachment_type
=
allure.attachment_type.MP4)
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
import
allure
from
selenium
import
webdriver
import
time
import
pytest
@allure
.testcase(
'https://www.baidu.com/'
,
'百度搜索功能'
)
@pytest
.mark.parametrize(
'data'
,
[
'allure'
,
'pytest'
,
'unittest'
],
ids
=
[
'search allure'
,
'search pytest'
,
'search unittest'
]
)
def
test_search(data):
with allure.step(
'步骤1:打开浏览器输入百度地址'
):
driver
=
webdriver.Chrome()
driver.implicitly_wait(
5
)
driver.get(
'https://www.baidu.com/'
)
with allure.step(f
'步骤2:在搜索框中输入{data}, 并点击百度一下'
):
driver.find_element_by_id(
'kw'
).send_keys(data)
driver.find_element_by_id(
'su'
).click()
time.sleep(
2
)
with allure.step(
'步骤3: 截图保存到项目中'
):
driver.save_screenshot(f
'./result/{data}.jpg'
)
allure.attach.
file
(f
'./result/{data}.jpg'
, name
=
f
'搜索{data}的截图'
, attachment_type
=
allure.attachment_type.JPG)
allure.attach(driver.page_source, f
'搜索{data}的网页内容'
, allure.attachment_type.HTML)
with allure.step(
'步骤4:关闭浏览器,退出'
):
driver.quit()
|
现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
分享他们的经验,还会分享很多直播讲座和技术沙龙
可以免费学习!划重点!开源的!!!
qq群号:485187702【暗号:csdn11】
最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走!
希望能帮助到你!
【100%无套路免费领取】