一、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)
执行代码,打开测试报告