一、fixTure
在单元测试的组件中,主要分为测试⽤例,测试固件,测试套件,测试执⾏以及测试报告,看过我书的同学对这些应该很清晰。测试固件也是不难理解,也就是在测试⽤例执⾏前需要做的动作和测试执⾏后需要做的事情。⽐如在UI的⾃动化测试中,我们更加关注的是对⻚⾯的操作,⽽不是关⼼打开浏览器和关闭浏览器,在数据库的操作中,更加关注的是对MySQL的基本操作,⽽不怎么关⼼连接数据库和数据库断开连接这部分。所以打开浏览器和关闭浏览器,连接数据库和关闭数据库部分,可以让测试固件去⼲,测试⽤例的层⾯更加关⼼测试⽤例的执⾏结果以及断⾔结果。在pytest的测试框架中,测试固件有各种形式的表现,⽐如除了刚才说的初始化与清理外,还有它强⼤的参数化的部分。下⾯还是通过具体的案例来说明这部分的应⽤。
包含测试固件和返回值
import pytest
"""1、返回值"""
@pytest.fixture()
def login(username='wuya',password='admin'):
if username=='wuya' and password=='admin':
return True
else:
print('账户或者密码错误')
def test_profile(login):
assert login==True
from selenium import webdriver
@pytest.fixture()
def driver():
return webdriver.Chrome()
def test_baidu_title(driver):
driver.get('http://www.baidu.com')
assert driver.title=='百度一下,你就知道'
2、函数编程方式
from selenium import webdriver import pytest import time as t
@pytest.fixture() def driver(): return webdriver.Chrome() @pytest.fixture() def init(driver): """'UI自动化测试固件""" driver.maximize_window() driver.get('http://www.baidu.com') yield #测试步骤和断言 driver.close() def test_baidu_title(init,driver): assert driver.title=='百度一下,你就知道' def test_baidu_so(init,driver): so=driver.find_element_by_id('kw') so.send_keys('航程') t.sleep(3) assert so.get_attribute('value')=='航程'
输入代码,执行结果为:

3、面向对象编程方式
from selenium import webdriver
import pytest
import time as t
class TestBaidu(object):
@pytest.fixture()
def driver(self):
return webdriver.Chrome()
@pytest.fixture()
def init(self,driver):
driver.maximize_window()
driver.get('http://www.baidu.com')
yield # 测试步骤和断言
driver.close()
def test_baidu_title(self,init,driver):
assert driver.title=='百度一下,你就知道'
def test_baidu_so(self,init,driver):
so=driver.find_element_by_id('kw')
so.send_keys('百度以下')
t.sleep(3)
assert so.get_attribute('value')=='百度以下'
执行结果为:

4、使用selenium插件执行
import pytest
import time as t
@pytest.fixture()
def init(selenium):
"""'UI自动化测试固件"""
selenium.maximize_window()
selenium.get('http://www.baidu.com')
yield #测试步骤和断言
selenium.close()
def test_baidu_title(init,selenium):
assert selenium.title=='百度一下,你就知道'
def test_baidu_so(init,selenium):
so=selenium.find_element_by_id('kw')
so.send_keys('航程')
t.sleep(3)
assert so.get_attribute('value')=='航程'
输入代码(),执行结果为,结果为:

5、qq实战
from selenium import webdriver
import time as t
import pytest
@pytest.fixture()
def driver():
return webdriver.Chrome()
@pytest.fixture()
def init(driver):
"""'UI自动化测试固件"""
driver.maximize_window()
driver.get('https://file.qq.com/')
yield #测试步骤和断言
driver.close()
def test_file_11_003(init,driver):
"""验证登陆的方式"""
driver.switch_to.frame('login_frame1')
t.sleep(2)
driver.switch_to.frame('ptlogin_iframe')
t.sleep(2)
driver.find_element_by_link_text('帐号密码登录').click()
t.sleep(2)
username=driver.find_element_by_xpath('//*[@id="uin_tips"]')
assert username.text=='支持QQ号/邮箱/手机号登录'
def test_file_qq_002(init,driver):
'''登录验证:校验点击注册跳转到注册的页面'''
driver.switch_to.frame('login_frame1')
t.sleep(2)
driver.switch_to.frame('ptlogin_iframe')
t.sleep(2)
nowHandler=driver.current_window_handle
driver.find_element_by_link_text('注册新帐号').click()
allHandlers=driver.window_handles
for handler in allHandlers:
if nowHandler!= handler:
driver.switch_to.window(handler)
t.sleep(2)
assert driver.title=='QQ注册'
二、、通过conftest.py可以共享fixture,fixture可以很好的解决测试固件的案例应用,依据它的思想可以编写多个案例,再本质的说就是通过conftest.py文件来达到共享fixture。conftest.py虽然是一个Python模块的文件,但是它是不能导入的,这点需要特别的注意。
conftest.py必须创建在工程下,才能共享信息(不用调用就可以用)

(1)、在conftest里输入共享的信息,相当于测试固件(初始化与清理)
from selenium import webdriver
import pytest
@pytest.fixture()
def driver():
return webdriver.Chrome()
@pytest.fixture()
def init(driver):
"""'UI自动化测试固件"""
driver.maximize_window()
driver.get('https://file.qq.com/')
yield #测试步骤和断言
driver.close()
(2)在另一个文件写测试步骤和断言:
import time as t
import pytest
def test_file_11_003(init,driver):
"""验证登陆的方式"""
driver.switch_to.frame('login_frame1')
t.sleep(2)
driver.switch_to.frame('ptlogin_iframe')
t.sleep(2)
driver.find_element_by_link_text('帐号密码登录').click()
t.sleep(2)
username=driver.find_element_by_xpath('//*[@id="uin_tips"]')
assert username.text=='支持QQ号/邮箱/手机号登录'
def test_file_qq_002(init,driver):
'''登录验证:校验点击注册跳转到注册的页面'''
driver.switch_to.frame('login_frame1')
t.sleep(2)
driver.switch_to.frame('ptlogin_iframe')
t.sleep(2)
nowHandler=driver.current_window_handle
driver.find_element_by_link_text('注册新帐号').click()
allHandlers=driver.window_handles
for handler in allHandlers:
if nowHandler!= handler:
driver.switch_to.window(handler)
t.sleep(2)
assert driver.title=='QQ注册'
输入代码(python -m pytest -v -s tests/test_qq.py),执行结果为:

1、什么时候需要加--driver Chrome
selenium是一个单独的库,如果导入这个库的,在命令提示符就不需要输入--driver Chrome
没有导入selenium,就需要加上--driver Chrome
三、安装插件:pip3 install pytest-sugar(美化)

四、配置
在Pytest的配置文件中,除了conftest.py外,
我们还可以使用pytest.ini,它是Pytest测试框架的主配置文件,可以改变Pytest默认行为,比如我们每次在执行时候带的-v输出详细的信息,以及-s打印输出详细的测试用例信息。我们在工程的根目录下创建pytest.ini的文件
在工程目录下新建:
[pytest]
#指定执行时候的默认信息
addopts= -v -s
#注册标记
markers=
login:执行标记为login的测试函数
register:执行标记为register的测试函数
logout:执行标记为logout的测试函数
#指定Pytest的最低版本号
minversion=3.0
#指定忽略执行的目录
norecursedirs=.pytest_cache
#指定测试目录
testpaths=tests
#指定测试模块搜索的规则
python_files=test_*
#指定测试类搜索的规则
python_classes=Test*
#指定测试函数搜索规则
python_functions=test_*
执行代码为:pytest tests/test_share.py

五、生成测试报告,形成html测试报告
1、安装库:pip3 install pytest-html
升级库:pip3 install -U pytest
2、在工程目录下创建一个:report

执行命令(1):pytest -v -s --html=report.htm,在当前目录下生成一个测试用例
执行命令(2):python -m pytest tests/ --html=report/index.html,把执行的测试用例放到report里面
执行第二种,会生成一个测试报告放在report下:


2、解压文件,打开文件的bin目录,添加到环境变量

3、安装库:pip3 install allure-pytest
1、第一种方法
(1)在命令控制台进入工程,输入:
(2)python -m pytest tests --alluredir=report/result --->result下生成json的文件
(3)allure generate report/result/ -o report/html --clean --->report下生成html的目录,里面包含了html的测试报告
(4)allure serve report/result-->启动allure的服务,自动打开测试报告
第二种方法:
import pytest
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 2==4
@pytest.mark.skip(reason='该功能已经取消')
def test_004():
pass
@pytest.mark.add
def test_admin_001():
pass
class TestLogin(object):
def test_login_001(self):
pass
def test_login_002(self):
assert 3==3
if __name__ == '__main__':
pytest.main(["-s","-v","test_add.py","--alluredir","./report/result"])
import subprocess
subprocess.call('allure generate report/result/ -o report/html --clean',shell=True)
subprocess.call('allure open -h 127.0.0.1 -p 8088 ./report/html',shell=True)
执行代码,打开测试报告

浙公网安备 33010602011771号