目录
1,pytest测试框架
1.2,具体使用
安装allure+pytest(pip)
Unittest VS pytest
?pytest安装&规则&约束
pytest断言
? 常用断言方法:?
pytest参数化
pytest常用运行参数
?pytest生成测试报告
pytest控制测试用例执行
?多进程运行用例
通过标记表达式执行用例
?重新运行失败用例
?pytest的setup & teardown函数
?
?
1,pytest测试框架
(1)单元测试:对软件中最小的单元(如函数‘,模块)进行测试
(2)框架:规范,帮助进行用例管理
(3)自动化框架:app自动化------appium
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?web自动化--------selenium
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 接口自动化--------request
1.2,具体使用
import pytest
class Testcase:
def setup(self):
print('start: --------loading-------- ')
def teardown(self):
print('end:------------close--------')
def test_01(self):
print("the first test")
assert 1 == 3
# 用例都是从上往下依次执行,若想先执行这个,可以用mark设置
@pytest.mark.run(order=1)
def test_02(self):
print("the second test")
assert 1 == 1
if __name__ == '__main__':
# ['-s','-v','test_py.py']
# -s 显示结果 -v显示详细用例
pytest.main()
?配置pytest.ini文件可以改变命名规则:
[pytest]
python_files=test_*.py *_test.py #文件都是以test_开头 或者 _test结尾命名,不符合则检测不到
python_classes=Test*
python_functions=test_*
安装allure+pytest(pip)
Unittest VS pytest
?
?
?pytest安装&规则&约束
? ?
?testpath在ini文件里面定义的测试路径。norecursedirs定义不想找的目录
在pytest.ini中定义:(pytest,ini中不能再注释中写中文,会报错!!)
[pytest]
; 只运行指定路径testpaths下文件(该行中文不可以写)
testpaths = testing doc
; 不运行该指定目录
norecursedirs = doc*
pytest断言
电商网站登录
from _pytest.monkeypatch import derive_importpath
import pytest
from selenium import webdriver
from time import sleep
def test_login_success():
driver_path = r"C:\Program Files\Google\Chrome\Application\chromedriver.exe"
driver = webdriver.Chrome(executable_path=driver_path)
driver.get("http://39.98.138.157/shopxo")
driver.find_element_by_link_text("登录").click()
driver.find_element_by_xpath("//*[@name='accounts']").send_keys("1111111111")
driver.find_element_by_xpath('//*[@name="pwd"]').send_keys("1111111111")
driver.find_element_by_xpath("//button[text()='登录']").click()
sleep(2)
# test equall?
#
welcome = driver.find_element_by_xpath("//*[contains(text(),'欢迎来到')]").text
# assert '1111111111, 欢迎来到' == welcome
driver.quit()
if __name__ == '__main__':
pytest.main(["-s","test_cema_assert.py"])
断言成功:
? 常用断言方法:
pytest参数化
import pytest
from selenium import webdriver
from time import sleep
@pytest.mark.parametrize(
"user,pw,excepted",
[("1111111111","1111111111","1111111111,欢迎来到"),
("dsgfas","1","1111111111,欢迎来到")],
ids=["case1","case2"])
#以上是两组用例:case1和case2
def test_login(user,pw,excepted):
driver_path = r"C:\Program Files\Google\Chrome\Application\chromedriver.exe"
driver = webdriver.Chrome(executable_path=driver_path)
driver.get("http://39.98.138.157/shopxo")
driver.find_element_by_link_text("登录").click()
driver.find_element_by_xpath("//*[@name='accounts']").send_keys(user)
driver.find_element_by_xpath('//*[@name="pwd"]').send_keys(pw)
driver.find_element_by_xpath("//button[text()='登录']").click()
sleep(2)
# test equall?
#
welcome = driver.find_element_by_xpath("//*[contains(text(),'欢迎来到')]").text
assert excepted == welcome
driver.quit()
if __name__ == '__main__':
pytest.main(["-s","test_param.py"])
pytest常用运行参数
?
?
?
?pytest生成测试报告
(1)生成junitXML文件(在指定文件夹report中)
?
(2)生成在线报告
pytest控制测试用例执行
import pytest
def test_fail01():
print("第一次失败")
assert 1==2
def test_fail02():
print("第二次失败")
assert 1==2
def test_fail03():
print("第三次成功")
assert 1==1
if __name__ == '__main':
pytest.main(["--maxfail=2","test_control.py"])
?多进程运行用例
安装pytest-xdist(用pip)
将测试发送到2个CPU
pytest.main(["-n","2","test_many.py"])
使用与计算机具有的CPU内核一样多的进程
pytest.main(["-n","auto","test_many.py"])
import py
import pytest
def test_case01():
assert 1==1
def test_case02():
assert 1==1
def test_case03():
assert 1==12
def test_case04():
assert 1==3
def test_case05():
assert 1==12
def test_case06():
assert 1==1
if __name__ == '__main__':
# 将测试发送到2个CPU
# pytest.main(["-n","2","test_many.py"])
# 使用与计算机具有的CPU内核一样多的进程
pytest.main(["-n","auto","test_many.py"])
?
通过标记表达式执行用例
pytest -m slow
这条命令会执行被装饰器@pytest.mark.slow装饰的所有测试用例
配置pytest.ini文件:
[pytest]
markers =
slow: marks tests as slow(deselect with '-m "not slow"')
serial
?前面表示会执行mark的用例,括号内是不选中标记的用例:则只会执行后两条
import pytest
def test_fail01():
print("第一次失败")
assert 1==2
@pytest.mark.slow
def test_fail02():
print("第二次失败")
assert 1==2
@pytest.mark.slow
def test_fail03():
print("第三次成功")
assert 1==1
if __name__ == '__main':
# pytest.main(["--maxfail=2","test_control.py"])
# 通过标记表达式执行
pytest.main(["-m","slow","test_mark.py"])
?重新运行失败用例
?
?
?
?pytest的setup & teardown函数
|