Pytest框架(常用执行命令)

一、Pytest的应⽤
  Pytest是基于Python语⾔的单元测试框架,也是⼀个命令⾏的⼯具,可以⾃动的找到测试⽤例执⾏和反馈反馈测试结果信息,在编写测试点⽅⾯⽐较⾃由,可以使⽤函数式的编程等语⾔,也可以使⽤⾯向对象的编程语⾔。⽽且它的断⾔使⽤的是Python原⽣的assert关键字,同时Pytest测试框架可以很完美的和unittest整合应⽤到⼀起,能够很好的进⾏兼容。Pytest⽐起unittest来说⽐较⾃由,使⽤unittest⾸先要继承TestCase的类,但是pytest是不需要的,安装成功后,直接编写测试函数或者测试⽅法就可以使⽤了。

  Pytest测试框架与unittest测试框架的区别

 

 

 安装的命令为:

  Pip3 install pytest
  安装成功后,就可以直接的使⽤。在pytest中,它会⾸先寻找以test开头或者以test结尾的测试模块,然后执⾏模
块⾥⾯以test开头或者是以test结尾的测试代码,这⾥依据这个要去,编写测试模块,

二、Pytest常用执行命令

import pytest

@pytest.mark.add
def add(a,b):
    return a+b

@pytest.mark.add
def test_add_001():
    assert add(1,1)==2

@pytest.mark.add
def test_add_002():
    assert add('hi','!')=='hi!'

@pytest.mark.add
def test_add_003():
    assert add(8,8)==15

@pytest.mark.skip(reason="该功能已经取消")
def test_add_004():
    pass

@pytest.mark.add
def test_admin_001():
    pass
class TestLogin(object):
    def test_login_001(self):
        pass

    def test_login_002(self):
        pass
if __name__ == '__main__':
    pytest.main(["-v","-s","test_add.py::TestLogin::test_login_001"])

  python -m pytest -v tests/ 模块级别的

 

 

   moduld级别:python3 -m pytest -v tests/test_add.py

 

 

   python -m pytest -v tests/test_add.py::test_add_001  执行具体的测试函数

 

 

   python -m pytest -v tests/test_add.py::TestLogin  执行测试类

 

   python -m pytest -v tests/test_add.py::TestLogin::test_login_001 执行测试方法

 

  (2) -k的是允许你使用表达式来指定希望执行的测试用例,比如某个测试名称是唯一的,以及多个测试名的最前面的名称或者后面名称一致,那么可以使用表达式来快速执行。

  python -m pytest -v -k "login" tests/test_wuya.py
  python -m pytest -v -k "login or logout" tests/test_wuya.py       or关系
  python -m pytest -v -k "login and logout" tests/test_wuya.py    and的关系

def test_login_001():
    pass

def test_login_002():
    pass

def test_logout_001():
    pass

def test_login_logout_001():
    pass

def test_regisater_001():
    pass

 

 

 

 

 

  (3)失败立刻停止:-x  我们希望失败立刻停止

         python -m pytest -v -x tests/test_add.py

 

 (4)指定失败次数:--maxfail

  当然也可以指定失败的次数,⽐如最⼤能够忍耐的失败次数,⽐如2,或者0,案例就为2,命令为:
  pytest -v -x --maxfail=2 tests/test_add.py

 

 (5)输出信息展示

  --tb=no:关闭信息
  --tb=short:只输出assert的错误信息
  --tb=line:⼀⾏展示所有的信息
   python -m pytest -v --tb=no tests/test_add.py

   python -m pytest -v --tb=short tests/test_add.py

    python -m pytest -v --tb=line tests/test_add.py

(6)定位错误:--lf

  在执⾏的时候出错,我们希望能够快速定位出具体是哪⼀⾏出错了,就会使⽤到--lf,命令为:
  python -m pytest -v --lf tests/test_add.py

 (9)忽略执⾏: -rs 在编写的测试点中,有的测试⽤例我们是忽略执⾏的

import pytest

@pytest.mark.skip(reason="该功能已经取消")
def test_add_004():
    pass

  python -m pytest -v -rs tests/test_add.py

(10)分组执⾏:-m -k

  k主要是应⽤测试搜索的⽅式,⽽m的⽅式是使⽤mark分组的⽅式。
  python -m pytest -v -m add -k admin tests/test_add.py

 (11)测试执行速度:--durations=N
使用该选项,可以加速测试用例的执行,当然有一点需要记住的是它不关心测试内部是怎么实现的,只统计测试过程中那个阶段执行速度是最慢的,如果参数是--duration=0,它就会按所有阶段耗时从长到短进行排序。

 三、Pytest与WebDriver

  ⾸先安装对应的库,安装的命令为:pip install pytest-selenium  pytest来操作webdriver

  selenium是主流的基于web应⽤程序的测试框架,它⽀持主流的浏览器,当然主流的开发语⾔也⽀持该测试框架在UI⾃动化测试中的应⽤。在pytest的测试框架中,需要特别强调的是,在⼀个测试函数或者测试⽅法中,selenium是固定参数,指的是driver,⽽什么是driver,driver是webdriver实例化后的对象。这⾥以测试百度⾸⻚的请求地址和title的测试点为案例,来说明pytest-selenium的应⽤。

   python -m pytest -v --driver Chrome tests/test_ui.py 指定被测试的浏览器

import pytest
import time as t

def test_baidu_title(selenium):
    selenium.maximize_window()
    selenium.get('http://www.baidu.com')
    selenium.implicitly_wait(30)
    assert selenium.title=="百度一下,你就知道"

def test_baidu_so(selenium):
    selenium.maximize_window()
    selenium.get('http://www.baidu.com')
    selenium.implicitly_wait(30)
    so=selenium.find_element_by_id('kw')
    so.send_keys('无涯 接口测试')
    t.sleep(3)
    assert so.get_attribute('value')=='无涯 接口测试'

Pytest参数化

  在pytest的测试框架中,我们也是可以通过parametrize来实现参数化的测试,达到刚才说的测试点,⽐如写⼀个add()的函数,那么现在来测试两个数的相加,会存在很多的测试场景的。

import pytest

def add(a,b):
    return a+b

@pytest.mark.parametrize("x,y,result",[
    (1,2,3),
    (2,3,5),
    ("Hi,","zhongguo","Hi,zhongguo"),
    (1.0,2.0,3.0),
    (0,0,0),
    (7,8,15)
])
def test_add_many(x,y,result):
  assert add(a=x,b=y)==result

@pytest.mark.parametrize("data",[
    (1,2,3),
    (2,3,5),
    ("Hi,","zhongguo","Hi,zhongguo"),
    (1.0,2.0,3.0),
    (0,0,0),
    (7,8,15)
])
def test_add_many(data):
    # print(data)
    assert add(a=data[0],b=data[1])==data[2]

if __name__ == '__main__':
  pytest.main(["-v","-s","test_params.py"])
#-v详细信息 -s 输出

 

 

 

posted @ 2021-08-24 17:57  wuyikai  阅读(309)  评论(0编辑  收藏  举报