iOS自动化探索(四)自动化测试框架pytest - 安装和使用
自动化测试框架 - pytest
pytest是Python最流行的单元测试框架之一, 帮助更便捷的编写测试脚本, 并支持多种功能复杂的测试场景, 能用来做app测试也能用作函数测试
官方文档: https://docs.pytest.org/en/latest/
pytest具有以下优点:
- 允许使用assert进行断言
- 自动识别测试脚本、类、函数
- 可用于管理小型或者参数类型的测试数据或资源
- 兼容unittest和nose测试框架
- 支持Python2.7/Python3.4+
- 丰富的插件支持,超过315个插件支持
pytest安装
- pip install -U pytest
如果提示下面的错误,说明是pip的版本太老了, 要更新下:
- Could not find a version that satisfies the requirement pytest (from versions: )
- No matching distribution found for pytest
更新方式:
- easy_install --upgrade pip
官方示例
准备一个test_sample.py, 内容如下:
- def inc(x):
- return x +
- def test_answer():
- assert inc() ==
在文件所在目录执行:
- pytest
这里我们做下说明:
pytest脚本都以test_xxx.py为文件名;
inc方法是我们定义的一个自增函数,该函数将传递进来的参数加1后返回;
test_answer是我们编写的一个测试函数,其中我们使用基本的断言语句assert来对结果进行验证,测试函数以test_xxx作为命名
执行结果如下:
- ============================================================ test session starts ============================================================
- platform darwin -- Python 2.7., pytest-4.1., py-1.7., pluggy-0.8.
- rootdir: /Users/jackey/Documents/iOS/code/iOS-Auto/Agent_Test, inifile:
- collected item
- test_sample.py F [%]
- ================================================================= FAILURES ==================================================================
- ________________________________________________________________ test_answer ________________________________________________________________
- def test_answer():
- > assert inc() ==
- E assert ==
- E + where = inc()
- test_sample.py:: AssertionError
- ========================================================= failed in 0.05 seconds ==========================================================
- (wda_python) bash-3.2$
当执行到assert inc(3) == 5时,报错
执行pytest会在当前目录和子目录中寻找test_xx.py的测试文件,并进入到测试文件中寻找test_xx开头的测试函数开始执行
执行pytest -q test_xxx.py是执行执行的脚本
在看一个例子,测试指定错误: (Assert that a certain exception is raised)
- import pytest
- def f():
- raise SystemExit()
- def test_mytest():
- with pytest.raises(SystemExit):
- f()
执行指令:
- pytest -q test_sysexit.py
输出:
- (wda_python) bash-3.2$ pytest -q test_sysexit.py
- . [%]
- passed in 0.04 seconds
- (wda_python) bash-3.2$
如果要开发多个测试方法,可以把方法写进一个class中
- class TestClass(object):
- def test_one(self):
- x = 'this'
- assert 'h' in x
- def test_two(self):
- x = 'hello'
- assert hasattr(x, 'check')
pytest能够自动识别类中的测试方法, 也不用我们去创建子类或者实实例, 运行结果如下:
- (wda_python) bash-3.2$ pytest -q test_sample.py
- .F [%]
- ================================================================== FAILURES ==================================================================
- _____________________________________________________________ TestClass.test_two _____________________________________________________________
- self = <test_sample.TestClass object at 0x102e151d0>
- def test_two(self):
- x = 'hello'
- > assert hasattr(x, 'check')
- E AssertionError: assert False
- E + where False = hasattr('hello', 'check')
- test_sample.py:: AssertionError
- failed, passed in 0.08 seconds
- (wda_python) bash-3.2$
除了直接在脚本路径执行pytest外, 还可以用以下方式
- python -m pytest xxx.py
出现第一个(或第N个)错误时停止
- pytest -x # stop after first failure
- pytest --maxfail= # stop after two failures
运行执行测试脚本
- pytest test_mod.py
运行指定目录下的所有脚本
- pytest testing/
运行包含指定关键字的测试方法, 可以是文件名、类名、测试函数名
- pytest -k "MyClass and not method"
执行node id运行测试脚本,每一个被收集的测试方法都会分配一个指定的id, 我们可以用一下方式运行执行的测试方法:
- # To run a specific test within a module
- pytest test_mod.py::test_func
- # To run a test within a class
- pytest test_mod.py::TestClass::test_method
日志打印的不同方式
- pytest --showlocals # show local variables in tracebacks
- pytest -l # show local variables (shortcut)
- pytest --tb=auto # (default) 'long' tracebacks for the first and last
- # entry, but 'short' style for the other entries
- pytest --tb=long # exhaustive, informative traceback formatting
- pytest --tb=short # shorter traceback format
- pytest --tb=line # only one line per failure
- pytest --tb=native # Python standard library formatting
- pytest --tb=no # no traceback at all
测试报告
pytest默认是完整的测试报告, 我们可以加上-r标签显示简短测试报告,可再搭配一下参数
- Here is the full list of available characters that can be used:
- f - failed
- E - error
- s - skipped
- x - xfailed
- X - xpassed
- p - passed
- P - passed with output
- a - all except pP
可以多个参数一起使用
Debug模式
- pytest --pdb
示例:
- (wda_python) bash-3.2$ pytest --pdb
- ========================================================== test session starts ===========================================================
- platform darwin -- Python 2.7., pytest-4.1., py-1.7., pluggy-0.8.
- rootdir: /Users/jackey/Documents/iOS/code/iOS-Auto/Agent_Test, inifile:
- collected items
- test_sample.py .F
- >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> traceback >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
- self = <test_sample.TestClass object at 0x10e928610>
- def test_two(self):
- x = 'hello'
- > assert hasattr(x, 'check')
- E AssertionError: assert False
- E + where False = hasattr('hello', 'check')
- test_sample.py:: AssertionError
- >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> entering PDB >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
- > /Users/jackey/Documents/iOS/code/iOS-Auto/Agent_Test/test_sample.py()test_two()
- -> assert hasattr(x, 'check')
- (Pdb) print x
- hello
- (Pdb) print hasattr(x,'check')
- False
- (Pdb)
还可以指定第几次失败开始进入debug:
- pytest -x --pdb # drop to PDB on first failure, then end test session
- pytest --pdb --maxfail= # drop to PDB for first three failures
任何失败的异常信息都会存储在sys.last_value,sys.last_type 以及 sys_last_traceback
在debug中可以通过以下方式获取最后报错的内容
- (Pdb) import sys
- (Pdb) sys.last_traceback.tb_lineno
- (Pdb) sys.last_value
- AssertionError(u"assert False\n + where False = hasattr('hello', 'check')",)
- (Pdb)
在执行一开始就进入到debug模式
- pytest --trace
输入next执行下一步, exit退出
脚本中设置断点
- import pdb
- pdb.set_trace()
例如:
- import pdb
- class TestClass(object):
- def test_one(self):
- x = 'this'
- pdb.set_trace()
- assert 'h' in x
- def test_two(self):
- x = 'hello'
- assert hasattr(x, 'check')
获取执行最慢的n个测试步骤
- pytest --durations=
- ======================================================= slowest test durations ========================================================
- (0.00 durations hidden. Use -vv to show these durations.)
但如果所有脚本的运行时间都小于0.01s, 就不显示了, 除非带上-vv参数
- pytest --durations= -vv
输出结果:
- ======================================================= slowest test durations ========================================================
- .00s call test_sample.py::TestClass::test_two
- .00s setup test_sysexit.py::test_mytest
- .00s setup test_sample.py::TestClass::test_two
- .00s setup test_sample.py::TestClass::test_one
- .00s teardown test_sample.py::TestClass::test_two
- .00s teardown test_sample.py::TestClass::test_one
- .00s call test_sysexit.py::test_mytest
- .00s teardown test_sysexit.py::test_mytest
- .00s call test_sample.py::TestClass::test_one
- =================================================== failed, passed in 0.06 seconds ===================================================
- (wda_python) bash-3.2$
将日志保存到指定文件
- pytest --resultlog=path
Disabling plugins
To disable loading specific plugins at invocation time, use the -p
option together with the prefix no:
.
Example: to disable loading the plugin doctest
, which is responsible for executing doctest tests from text files, invoke pytest like this:
- pytest -p no:doctest
我们也可以在pytestdemo脚本中去启动pytest:
- import pytest
- pytest.main()
执行python pytestdemo.py就可以执行pytest
main()不会抛出SystemExit的异常, 但会返回exitcode, 一共有6种exitcode
- Exit code : All tests were collected and passed successfully
- Exit code : Tests were collected and run but some of the tests failed
- Exit code : Test execution was interrupted by the user
- Exit code : Internal error happened while executing tests
- Exit code : pytest command line usage error
- Exit code : No tests were collected
我们试着加上打印
- import pytest
- print pytest.main()
输出:
- (wda_python) bash-3.2$ python pytestDemo.py
- ========================================================== test session starts ===========================================================
- platform darwin -- Python 2.7., pytest-4.1., py-1.7., pluggy-0.8.
- rootdir: /Users/jackey/Documents/iOS/code/iOS-Auto/Agent_Test, inifile:
- collected items
- test_sample.py .F [ %]
- test_sysexit.py . [%]
- ================================================================ FAILURES ================================================================
- ___________________________________________________________ TestClass.test_two ___________________________________________________________
- self = <test_sample.TestClass object at 0x1038ba650>
- def test_two(self):
- x = 'hello'
- > assert hasattr(x, 'check')
- E AssertionError: assert False
- E + where False = hasattr('hello', 'check')
- test_sample.py:: AssertionError
- =================================================== failed, passed in 0.05 seconds ===================================================
- (wda_python) bash-3.2$
我们还可以在main中传递参数:
- pytest.main(['-q','test_sample.py'])
给pytest.main添加plugin, 如下示例在执行的开头和结尾, 添加打印信息
- import pytest
- class MyPlugin(object):
def pytest_sessionfinish(self):
print '*** Test run reporting finishing'- def pytest_sessionstart(self):
print '*** Test run report beginning'- pytest.main(['-q','test_sample.py'], plugins=[MyPlugin()])
输出:
(wda_python) bash-3.2$ python pytestDemo.py
*** Test run report beginning
.F [100%]*** Test run reporting finishing
================================================================ FAILURES ================================================================
___________________________________________________________ TestClass.test_two ___________________________________________________________
self = <test_sample.TestClass object at 0x1090843d0>
def test_two(self):
x = 'hello'
> assert hasattr(x, 'check')
E AssertionError: assert False
E + where False = hasattr('hello', 'check')
test_sample.py:11: AssertionError
1 failed, 1 passed in 0.05 seconds
iOS自动化探索(四)自动化测试框架pytest - 安装和使用的更多相关文章
- iOS自动化探索(一)WebDriverAgent安装
WebDriverAgent FaceBook推出的一款iOS移动测试框架, 支持真机和模拟器, 同时支持USB, 官方是这样介绍的: https://github.com/facebook/WebD ...
- python3: 自动化测试框架pytest
最近在学习web自动化,所以在这里总结一下pytest框架. 其实pytest 和 unittest 都是自动化测试框架,但是pytest更好用一些,有以下几个优点:1)可以根据标签执行用例:2)?? ...
- iOS自动化探索(七)自动化测试框架pytest - 测试报告
这里我们单独来看下关于如何生存测试报告 准备测试代码如下: #coding: utf- import pytest @pytest.fixture() def login(): print '输入账号 ...
- iOS自动化探索(六)自动化测试框架pytest - fixtures
Fixture介绍 fixture是pytest特有的功能,它用pytest.fixture标识,定义在函数前面.在编写测试函数的时候,可以将此函数名称做为传入参数,pytest将会以依赖注入方式,将 ...
- iOS自动化探索(五)自动化测试框架pytest - Assert断言的使用
使用assert语句进行断言 pytest允许使用标准的python assert语法,用来校验expectation and value是否一致 代码演示: def func(): def test ...
- iOS自动化探索(八)Mac上的Jenkins安装
安装Jenkins 首先检查是否有Jenkins依赖的java环境 java -version 出现java version "1.8.xx"说明已经安装了java Jackeys ...
- Python接口自动化测试框架: pytest+allure+jsonpath+requests+excel实现的接口自动化测试框架(学习成果)
废话 最近在自己学习接口自动化测试,这里也算是完成一个小的成果,欢迎大家交流指出不合适的地方,源码在文末 问题 整体代码结构优化未实现,导致最终测试时间变长,其他工具单接口测试只需要39ms,该框架中 ...
- 【Mac + Python3.6 + ATX基于facebook-wda】之IOS自动化(一):WebDriverAgent安装
此篇介绍如何安装WebDriverAgent,下一篇介绍facebook-wda库的安装使用以及自动化脚本的开发. 前言: 对于iOS的应用的测试,如果不需要用到图像识别,推荐使用这个项目facebo ...
- iOS自动化探索(十)代码覆盖率统计
iOS APP代码覆盖率统计 今年Q3季度领导给加了个任务要做前后端代码覆盖率统计, 鉴于对iOS代码代码比较熟就选择先从iOS端入手,折腾一整天后终于初步把流程跑通了记录如下 覆盖率监测的原理 Xc ...
随机推荐
- vue事件修饰器
事件修饰器 Vue.js 为 v-on 提供了 事件修饰符.通过由点(.)表示的指令后缀来调用修饰符.· .stop .prevent .capture .self <div id=" ...
- tomcat 配置文件 介绍
[root@mysql logs]# cd ../conf/ [root@mysql conf]# ll总用量 228drwxr-x---. 3 root root 4096 11月 15 2018 ...
- 007-shiro与spring web项目整合【一】基础搭建
一.需求 将原来基于url的工程改成使用shiro实现 二.代码 https://github.com/bjlhx15/shiro.git 中的permission_shiro 三.去除原项目拦截器 ...
- C# 调用win api获取chrome浏览器中地址
//FindWindow 查找窗口 //FindWindowEx查找子窗口 //EnumWindows列举屏幕上的所有顶层窗口,如果回调函数成功则返回非零,失败则返回零 //GetWindowText ...
- Tornado的基本知识
Tornado是FriendReed使用的可扩展的非阻塞式的web服务器及其相关工具的开源版本. 这个框架看起来有些像web.py或者Google的webapp,不过为了能有效利用非阻塞服务器环境,这 ...
- samba、nginx服务
一.部署samba Samba是在Linux和UNIX系统上实现SMB协议的一个免费软件,由服务器及客户端程序构成,Samba主要用于Linux或UNIX和Windows系统之间的文件共享. SMB( ...
- Canvas:橡皮筋线条绘制
Canvas:橡皮筋线条绘制 效果演示 实现要点 事件监听 [说明]: 在Canvas中检测鼠标事件是非常简单的,可以在canvas中添加一个事件监听器,当事件发生时,浏览器就会调用这个监听器. 我们 ...
- akka框架地址
http://doc.akka.io/docs/akka/2.2.3/AkkaJava.pdf
- Python3.x:Linux下安装python3.6
Python3.x:Linux下安装python3.6 下载 #先进入download文件夹 cd /home/download #输入命令(下载到当前目录) wget https://www.pyt ...
- jQuery动态网址标签
在线演示 本地下载