pytest的详细教程及与unittest对比
一、pytest与unittest对比
二、pytest基本操作
测试用例命名
1)文件命名:
test_*.py或*_test.py命名
2)测试用例类以Test开头命名,方法以test开头命名3
前置后置
格式为:
@pytest.fixture(scope="class") def init_driver(): driver=webdriver.Chrome() driver.get("https://www.baidu.com") yield driver #yield区分前后置,以上为前置,以下为后置,返回参数直接写在yield后面(相当于return的作用) driver.quit()
scope=“级别”,其中session>module>class>function
session | 可跨文件调用,多个文件调用一次 |
module | 每一个.py文件调用一次 |
class | 每一个类调用一次 |
function | 没一个函数或方法都会调用,级别默认不填即是此级别 |
调用前置后置:
如上定义了一个级别为class的前置后置,在Test开头的类中,不需要再去编写setup和teardown,直接在类前面加上@pytest.mark.usefixtures("前置后置函数名称"),具体如下:
@pytest.mark.usefixtures("init_driver") #括号里面加上前置后置的函数名称 class Testlogin(self,init_driver): #前置后置若有返回值,需要在测试用例类里面加上前置后置的函数名称(与前置后置的函数名称保持一致,不可自定义) init_driver.refresh() #使用driver时全部改为init_driver
前置后置共享:
在需要共享的目录下创建conftest.py,作用域仅限于其当前目录和子目录的用例都可共享此前置后置,使用时可直接调用(作用:可用于全部测试用例数据准备和清理)
@pytest.fixture(scope="session",autouse=True) #autouse默认为false,所以需要调用才会生效,这里设置为True,会自动执行一次 def init(): driver=webdriver.Chrome() yield driver driver.quit()
前置后置内部继承:
可定义多个前置后置的函数,之间可以内部继承使用,但注意继承规则:级别低的可以继承级别高的,同级别也可调用继承
举例:login_web调用了init_driver,并用init_driver接收了返回值(这里init_driver和login_web是同级,函数级别),调用时直接使用login_web就可以了
其执行的顺序是:init_driver的前置——login_web的前置——执行用例——login_web的后置——init_driver的后置
参数化
pytest使用参数化实现数据驱动,直接在需要测试用例前面加上:
@pytest.mark.parametrize("参数名",列表数据)
参数名:用来接收每一项数据,并作为测试用例的参数
列表数据:一组测试数据
举例:@pytest.mark.parametrize("参数1,参数2",[(数据1,数据2),(数据1,数据2)]) #每次会将一个元组里面的数据1传给参数1,数据2传给参数2
@pytest.mark.parametrize("参数名",[数据1,数据2,数据3]) #每次传入单个参数,第一次将数据1传给参数1,第二次将数据二传给参数二,依次类推
断言
pytest使用assert表达式
举例:assert a==b
用例标记
注册标记:
创建pytest.ini文件,在文件中按照以下方式添加标签名:
[pytest] markers= 标记名:注释 备注:若要注册多个标记名,换行写即可,冒号之后是可选的描述信息(可不填),另:标记名和注释需要为英文,目前不支持中文
用例添加标记:
在用例前面添加标记,格式为:
@pytest.mark.标记名1 @pytest,mark.标记名2 def test_login(): pass
运行打标记的测试用例:
在命令行输入:@pytest -m 标记名
在代码航写入:@pytest main(["-m","标记名"])
用例运行
在命令行输入:cd到要运行用例的根目录下,输入pytest
在代码行输入:pytest.mian()
用例执行顺序
按照以下顺序进行搜索执行:
1、先识别到的文件里面的用例先执行(按照文件命名排序,ASCII码)
2、在.py文件里,按照代码的先后执行顺序执行用例
三、pytest常用命令参数
pytest -s | 输出我们用例中的调试信息(譬如代码里面的print) |
pytest --collect-onty | 收集要执行的用例,但不会执行 |
pytest -v | 输出用例更加详细的执行信息 |
pytest -m 标记名 | 执行标记的指定用例 |
pytest -k args | 执行包干关键字的用例 |
pytest -x | 用例运行失败立马停止执行 |
pytest --maixfial=num | 用例运行允许失败次数,超过即停止 |