一、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')=='航程'

  输入代码,执行结果为:

pytest学习(二)_chrome

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')=='百度以下'

  执行结果为:

pytest学习(二)_chrome_02

 

 

 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')=='航程'

  输入代码(),执行结果为,结果为:

pytest学习(二)_测试报告_03

 

 

 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必须创建在工程下,才能共享信息(不用调用就可以用)

pytest学习(二)_chrome_04

 

 

 (1)、在conftest里输入共享的信息,相当于测试固件(初始化与清理)

装饰器@pytest.fixture(),它是声明⼀个函数是fixture,如果测试函数的参数列表中包含了fixture名,那么pytest执
⾏的时候,就会检测到,并且在测试函数运⾏之前执⾏该fixture,fixture可以完成任务,也可以返回数据给测试函
 
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),执行结果为:

pytest学习(二)_html_05

1、什么时候需要加--driver Chrome

selenium是一个单独的库,如果导入这个库的,在命令提示符就不需要输入--driver Chrome

没有导入selenium,就需要加上--driver Chrome

三、安装插件:pip3 install pytest-sugar(美化)

  1、执⾏后代码后输出就会显示进度条:

pytest学习(二)_测试报告_06

 

 

 四、配置

在Pytest的配置文件中,除了conftest.py外,

我们还可以使用pytest.ini,它是Pytest测试框架的主配置文件,可以改变Pytest默认行为,比如我们每次在执行时候带的-v输出详细的信息,以及-s打印输出详细的测试用例信息。我们在工程的根目录下创建pytest.ini的文件

在工程目录下新建:pytest学习(二)_固件_07

[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

pytest学习(二)_chrome_08

五、生成测试报告,形成html测试报告

1、安装库:pip3 install pytest-html

     升级库:pip3 install -U pytest

2、在工程目录下创建一个:report

pytest学习(二)_测试报告_09

执行命令(1):pytest -v -s --html=report.htm,在当前目录下生成一个测试用例

执行命令(2):python -m pytest tests/ --html=report/index.html,把执行的测试用例放到report里面

执行第二种,会生成一个测试报告放在report下:

pytest学习(二)_html_10

3、对执⾏失败的再次执⾏,安装命令为:pip3 install pytest-rerunfailures
执行代码:python3 -m pytest tests/ --html=report/index.html

 pytest学习(二)_测试报告_11

 
四、生成测试报告
1、下载文件:
pytest学习(二)_python_12

 

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

 pytest学习(二)_测试报告_13

 

 

 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)

  执行代码,打开测试报告

pytest学习(二)_测试报告_14