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()
最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走! 希望能帮助到你!【100%无套路免费领取】