pytest框架学习

安装:

python3.9

pip命令:pip3 install -U pytest或者

              pip3 install pytest -i http://pypi.douban.com/simple/--trusted-host pypi.douban.com

下载安装pycharm,修改测试框架

 

若使用run运行用例失败找不到pytest,使用一下命令运行测试用例:

python3 -m pytest -v 文件名称.py

pytest 执行用例规则:

注意:下面讲的都是在CMD中执行pytest命令;

1、某个目录下所有的用例:pytest

2、执行某一个py文件下的用例:pytest 脚本名称.py

3、运行start.py模块里面的某个函数,或者某个类,某个类里面的方法,加-v和不加-v都可以,加-v的话,打印的信息更相信;

pytest -v 08_mark.py::TestClass::test_method

pytest 08_mark.py::TestClass::test_method

pytest start.py::test_answer

4、运行start.py模块里面,测试类里面的某个方法:pytest start.py::TestClass::test_two

5、-m标记表达式:pytest -m login,将运行用@pytest.mark.login装饰器修饰的所有测试;

6、-q简单打印,只打印测试用例的执行结果:pytest -q start.py

7、-s详细打印:pytest -s start.py

8、-x遇到错误时停止错误:pytest start.py -x

9、-maxfail=num,当用例错误个数达到指定数量时,停止测试:pytest start.py --maxfail=1

10、-k匹配用例名称,执行测试用例名称包含http的所有用例:pytest -s-k http start.py

11、-k根据用例名称排除某些用例:pytest -s-k "not http" start.py

12、-k同时匹配不同的用例明层:pytest -s-k"method or weibo" start.py

断言:

pytest里面断言实际上就是python里面的assert断言方法,常用的有以下几种:

assert xx:判断xx为真;

assert not xx:判断xx不为真;

assert a in b:判断b包含a;

assert a==b:判断a等于b;

assert a!=b:判断a不等于b;

pytest提供了类似setup、teardown的方法,一共有十种:

模块级别:setup_module、teardown_module;

函数级别:setup_function、teardown_function;

方法级别:setup_method、teardown_method;

方法细化级别:setup、teardown

但需要注意的是这些方法都是对整个测试脚本有效的,如果有一个场景是用例需要1登录,用例2不需要登录,用例3又需要登录的话,这些方法就不再适用,所以需要引入fixture;

Fixture:

fixture可以让我们自定义测试用例的前置条件

优势:

命名方式灵活,不局限于setup和teardown这几个命名;

conftest.py配置里可以实现数据共享,不需要import就能自动找到fixture;

scope="module"可以实现多个.py跨文件共享前置;

scope="session"以实现多个.py跨文件使用一个session来完成多个用例;

fixture参数:@pytest.fixture(scope="function",params=None,autouse=False,ids=None,name=None)

scope:可以理解成fixture的作用域,默认:function,还有class、module、package、session四个【常用】

autouse:默认False,需要用例手动调用该fixture;如果True,所有作用域内的测试用例都会自动调用该fixture;

name:默认:装饰器的名称,同一模块的fixture相互调用建议写个不同的name

注意:session的作用域,是整个测试会话,即开始执行pytest到结束测试;

调用fixture:

1、将fixture名称作为测试用例函数的的输入参数;

2、测试用例加上装饰器:@pytest.mark.usefixtures(fixture_name)

3、fixture设置autouse=True

知识点:

在类声明上面加@pytest.mark.usefixtures(),代表这个类里面所有测试用例都会调用该fixture;

可以叠加多个@pytest.mark.usefixtures(),先执行的放低层,后执行的放上层;

可以传多个fixture参数,先执行的放前面,后执行的放后面;

如果fixture有返回值,用@pytest.mark.usefixtures()是无法获取到返回值的,必须用传参

 

 的方式;

添加了@pytest.fixture,如果fixture还想依赖其他fixture,需要用函数传参的方式,不能用@pytest.mark.usefixtures()的方式,否则不会生效;

fixture的实例化顺序:

较高scope范围的fixture(session)在较低scope范围的fixture(function、calss)之前实例化【session>package>module>class>function】

具有相同作用域的fixture遵循测试函数中声明的顺序,并遵循fixture之间的依赖关系【在fixture_A里面依赖的fixture_B优先实例化,然后到fixture_A实例化】

自动使用(autouse=True)的fixture将在显式使用(传参或装饰器)的fixture之前实例化

fixture值yield实现teardown:

用fixture实现teardown并不是一个独立的函数,而是用yield关键字来开启teardown操作;

yield注意事项:

如果yield前面的代码,即setup部分已经抛出异常了,则不会执行yield后面的teardown内容;

如果测试用例抛出异常,yield后面的teardown内容还是会正常执行;

用例执行状态:

用例执行完成后,每条用例都有自己的状态,常见的状态有:

passed:测试通过;

failed:断言失败;

error:用例本身写的质量不行,本身代码报错;

xfail:预期失败,加了@pytest.mark.xfail()

conftest.py:

一个专门存放fixture的配置文件,单独管理一些全局的fixture;

conftest.py配置fixture注意事项:

pytest会默认读取conftest.py里面的所有fixture;

conftest.py文件名称是固定的,不能改动;

conftest.py只对同一个package下的所有测试用例生效;

不同目录可以有自己的conftest.py,一个项目中可以有多个conftest.py;

测试用例文件中不需要手动import conftest.py,pytest会自动查找;

pytest.mark.skip:

pytest.mark.skip可以标记无法在某个平台上运行的测试功能,或者希望失败的测试功能;

希望满足某些条件才执行某些测试用例,否则pytest会跳过运行该测试用例;

实际常见场景:跳过非windows平台上的仅windows测试,或者跳过依赖当前不可用的外部资源的测试;

@pytest.mark.skip可以加在函数上,类上,类方法上如果加在类上面,类里面的所有测试用例都不会执行;

pytest.skip()函数基础使用:

作用:在测试用例执行期间强制跳过不再执行剩余内容;

类似:在python的循环里面,满足某些条件则break跳出循环;

pytest.skip(msg="",allow_module_level=False)

当allow_module_level=True时,可以设置在模块级别跳过整个模块;

 

 

 如果不确定sys.platform的信息,可以先使用print(sys.platform)将其打印出来;

生成html测试报告插件:

安装插件:pip3 instal pytest-html

运行命令:pytest 文件名.py --html=./example/report/result.html

测试用例失败后重拾插件:

安装插件:pip3 install pytest -rerunfailures

运行命令:pytest 文件名.py --reruns 次数

重复执行插件(重复执行直到测试失败,验证偶现问题)

安装插件:pip3 install pytest -repeat

运行命令:pytest --count 次数 文件名.py

@pytest.mark.repeat(count)

如果要在代码中将某些测试用例标记为执行重复多次,可以使用@pytest.mark.repeat(count)

--repeat-scope:可以覆盖默认的测试用例执行顺序,scope参数可以是function,class,module,session,当赋予scope值后,先重复执行该scope的测试用例,再单一执行别的测试用例,感觉和标签的作用一致;pytest-repeat不能与unittest.TestCase测试类一起使用;

分布式测试pytest-xdist插件:

安装插件:pip3 install pytest-xdist

pytest-xdist的出现就是为了让自动化测试用例可以分布式执行,从而节省自动化测试时间;

该插件实现:

测试运行并行化:如果有多个CPU或主机,则可以将它们用于组合的测试执行,这样可以加快开发速度或使用远程计算机的特殊资源;

--looponfail:在子进程中重复执行测试,每次运行之后,pytest都会等到项目中的文件更改后再运行之前失败的测试,重复此过程,知道所有测试通过,然后再次执行完整运行;

跨平台覆盖:可以指定不同的python解释程序或不同的平台,并在所有这些平台上并行运行测试;

大致原理:

xdist的分布式类似于一主多从的结构,master机负责下发命令,控制slave机,slave机根据master机的命令执行特定测试任务;

在xdist中,主是master,从是workers;

xdist会产生一个或多个wokers,workers都通过master来控制;

每个worker负责执行完整的测试用例集,然后按照masterd的要求运行测试,而master不执行任务;

@pytest.mark.parametrize()当出现相似的测试用例,比如测试登录时,我们要设置登录名正确,密码正确;登录名错误,密码正确;登录名正确,密码错;登录名和密码均为空等相似的测试用例,可以使用该标记减少代码冗余;具体使用方法参考以下例子:

 

 

 当定位到多个元素的时候,使用以下方法进行点击:

 

 

 pytest.assume()多重断言(即使一个失败,剩余的仍会继续执行)

 

 

 当跳转多层iframe框时,要想回退到之前的iframe框,必须先回到最外层,例如:

 

 

滑块操作:

 

 各类等待方法:

(1)强制等待:time.sleep():在操作进行强制等待;

(2)隐式等待:driver.implicity_wait(20):最多20秒,等待元素加载后操作,作用域是整个webdrive;

(3)显示等待:只对指定元素生效:

element=WebDriverWait(driver,10,0.5).until(

EC.presence_of_element_located((By.ID,"kw")))

当点击跳转打开一个新window后,要想定位新页面的元素需要切换窗口句柄:

 

 当页面元素在div大框中包着,要想定位到元素,可以从包裹在最外层的div框开始一层一层的往下找,此时driver.find_element_by_方法可以写很多个,直到找到该元素,例如(一般适用于列表查找,查找到多个元素时要使用.find_elements,注意注意!页面加载要停顿,不然死都找不到!!!!!!!!!!!!)

 

 截图:

 

 页面滚动:

 

posted @ 2021-11-01 15:57  小白要加油  阅读(290)  评论(0)    收藏  举报