1、安装pytest
pip install -i 镜像源 pytest
2、pytest的默认规则
a、pytest不需要定义类,可以直接写测试用例函数
def test_demo1:
print('test_demo1')
3、pytest的ini配置文件,用来指定输出方式及指定用例名称规则,打mark标记过滤用例
[pytest]
addopts = -s #指定运行用例输出结果的格式为标准输出
#指定测试用例模块名规则
python_files=test_*.py
#指定测试用例类命名规则
python_classes=Test*
#指定测试用例命名规则
python_functions=test_*
markers
conf: confest demo
csdn: csdn test login
4、confest统一管理前置后置,避免冗余
先在pycharm里面建一个confest.py的文件,之后开始导包,写前置后置用例,以打开浏览器为例
import pytest
from selenium import webdriver
@pytest.fixture(默认为函数级别的前置,可以通过scope="class"/moudle/package指定前置后置的级别)
def _driver():
driver=webdriver.Chrome()
#print('函数级别的前置操作')
yield driver #返回数据但不停止函数
#print('函数级别的后置操作')
a.新建conftest.py文件,文件名必须是conftest
b.定义前置后置的fixture函数@pytest.fixture
def _driver():
#前置操作
yield 返回数据1,返回数据2
#后置操作
def _driver(): #前置操作 yield 返回数据1, 返回数据2 #后置操作 fixture默认为 function函数级别
3.每个包都可以 拥有自己的 conftest.py测试夹具, 它不是共有 session级别整个项目可用
4.fixture函数 可以作为参数传递给其它fixture函数, 灵活组合不同的应用场景
目的: 减少前置和后置操作的冗余代码
5.一个测试用例在使用fixture函数时, 形参位置可以接收多个fixture函数 fixture中的scope级别, 决定 前置后置操作 什么时间执行及执行的次数.
函数级别的的前置后置
def setup_function:
print('函数级别的前置')
def teardown_function:
print('函数级别的的后置')
类级别的前置后置
class LoginDemo1:
def setup_class():
print('类级别的前置')
def setup_method():
print('类中函数级别的前置')
def teardown_method():
print('类中函数级别的后置')
def teardown_class():
print('类级别后置')
模块级别的的前置后置
def setup():
print('模块级别的前置')
def teardown():
print('模块级别的后置')
项目级别的前置后置
5、在pycharm里建一个test_demo1.py的用例文件
import pytest
@pytest.mark.conf
def test_001(-driver):#将fixture的函数名称,写在测试用例的参数位置,测试用例执行时会自动调用
driver = -driver
driver.get('http://www.baidu.com')
#print('第一条测试用')
6、pytest的参数化,在pycharm里建一个test_csdn_login.py的用例文件,在ini配置文件中加入csdn用例标签,在执行文件中将标签换为csdn
from time import sleep
import pytest
from selenium import webdriver
from selenium.webdriver.common.by import By
login_data=[('17525587986','123xjgjkh'),('17612454565','12sfgf')]#参数化的参数
class Test_CSDNLogin:
def setup_class(self):
self.driver=webdriver.Chrome()
self.driver.maximize_window()
self.driver.implicitly_wait(10)
self.driver.get('https://www.csdn.net/')
self.driver.find_element(By.LINK_TEXT,'登录').click()
self.driver.switch_to.frame('passport_iframe')
self.driver.find_element(By.CSS_SELECTOR,'body > div > div > div > div.login-box > div.login-box-top > div.login-box-tabs > div.login-box-tabs-items > span:nth-child(4)').click()
def teardown_class(self):
sleep(3)
self.driver.quit()
def setup_method(self):
pass
def teardown_method(self):
sleep(2)
self.driver.refresh()
@pytest.mark.csdn
@pytest.mark.parametrize('uname,pwd',login_data)#参数化
def test_tb_login(self,uname,pwd):
self.driver.find_element(By.CSS_SELECTOR,'body > div > div > div > div.login-box > div.login-box-top > div > div.login-box-tabs-main > div > div:nth-child(1) > div > input').send_keys(uname)
self.driver.find_element(By.CSS_SELECTOR,'body > div > div > div > div.login-box > div.login-box-top > div > div.login-box-tabs-main > div > div:nth-child(2) > div > input').send_keys(pwd)
self.driver.find_element(By.CLASS_NAME,'base-button').click()
7、执行pytest的用例,在用例文件之外创建用例加载和执行的runner.py文件
import test
if __name__=='__main__':
pytest.main(['-m','conf'])
8、allure报告
import os
import pytest
if __name__=='__main__':
pytest.main(['-m','csdn','--alluredir','./csdn'])
os.system('allure generate ./csdn -o ./csdnreport --clean')