UnitTest测试框架全栈详解

主要的测试维度:

1、表单的错误提示信息验证

2、产品的业务逻辑

3、页面的交互

单元测试

端元测试时最基本也是最底层的策划类型,单元测试应用于最基本的代码软件,在python中,单元测试框架主要是unit test

unittest始于标准库,安装了python解释器后就可以直接导入使用了

 

 

 

一个完整的自动化测试用例的组成:

1、初始化

2、测试步骤

3、断言

4、清理

 

如以百度搜索“赵丽颖”为例:

(1)初始化就是打开浏览器,进入百度;

(2)测试步骤:就是你输入关键字“马云”然后搜索到相关内容的过程;

(3)断言:就是断言我们搜索到的内容与输入的关键字的比较("is"、"in"、"=="),断言的方式:

A、python原生的assert断言方法;

B、selenium原生的断言方法:

a.saaertEqual:比较两个对象是否相等;

b.assertIN:比较一个对象是否包含另一个对象;

c.assertTrue:针对bool类型验证true or false;真真为真,真假为假,即断言内容返回真,则为真,断言内容返回假则为假。

d.assertFalse:针对bool类型验证true or false;假假为真,假真为假,即断言内容返回假,则为真,断言内容返回真则为假。

(4)清理:关闭浏览器的过程。

 

 测试套件:

TestSuite:在一个测试套件里面可以包含很多的测试用例,可以把它理解为一个容器

它可以分为两个类目:

1、按测试类来执行测试用例

 

 

  

import unittest
from selenium import webdriver
import time

class SinaTest(unittest.TestCase):
	def setUp(self) -> None:
		self.driver=webdriver.Chrome()
		self.driver.maximize_window()
		self.driver.get('https://mail.sina.com.cn/#')
		self.driver.implicitly_wait(30)


	def tearDown(self) -> None:
		self.driver.quit()

	def test_login_nulll(self):
		# 验证账户密码为空的提示信息
		self.driver.find_element_by_id('freename').send_keys('')
		self.driver.find_element_by_id('freepassword').send_keys('')
		self.driver.find_element_by_class_name('loginBtn').click()
		divtest=self.driver.find_element_by_xpath('/html/body/div[3]/div/div[2]/div/div/div[4]/div[1]/div[1]/div[1]/span[1]')
		time.sleep(3)
		self.assertEqual(divtest.text,'请输入邮箱名')

	def test_login_emal_format(self):
		# 验证账户格式不规范的提示信息
		self.driver.find_element_by_id('freename').send_keys('afafafaf')
		self.driver.find_element_by_id('freepassword').send_keys('dasda')
		self.driver.find_element_by_class_name('loginBtn').click()
		divtest=self.driver.find_element_by_xpath('/html/body/div[3]/div/div[2]/div/div/div[4]/div[1]/div[1]/div[1]/span[1]')
		# 比较两个对象是否相等
		time.sleep(3)
		self.assertEqual(divtest.text,'您输入的邮箱名格式不正确')


	def test_login_isButton(self):
	# 	验证自动登录是否默认勾选
		divTest=self.driver.find_element_by_id('store1')
		divTest.click()
		# 针对布尔类型验证assertTure
		self.assertFalse(divTest.is_selected())

	if __name__=='__main__':
		# 按测试类来执行
		# seite=unittest.TestLoader().loadTestsFromTestCase('SinaTest')

2、按照测试模块来执行测试用例

 

 

 

import unittest
from selenium import webdriver
import time

class SinaTest(unittest.TestCase):
	def setUp(self) -> None:
		self.driver=webdriver.Chrome()
		self.driver.maximize_window()
		self.driver.get('https://mail.sina.com.cn/#')
		self.driver.implicitly_wait(30)


	def tearDown(self) -> None:
		self.driver.quit()

	def test_login_nulll(self):
		# 验证账户密码为空的提示信息
		self.driver.find_element_by_id('freename').send_keys('')
		self.driver.find_element_by_id('freepassword').send_keys('')
		self.driver.find_element_by_class_name('loginBtn').click()
		divtest=self.driver.find_element_by_xpath
('/html/body/div[3]/div/div[2]/div/div/div[4]/div[1]/div[1]/div[1]/span[1]') time.sleep(3) self.assertEqual(divtest.text,'请输入邮箱名') def test_login_emal_format(self): # 验证账户格式不规范的提示信息 self.driver.find_element_by_id('freename').send_keys('afafafaf') self.driver.find_element_by_id('freepassword').send_keys('dasda') self.driver.find_element_by_class_name('loginBtn').click() divtest=self.driver.find_element_by_xpath
('/html/body/div[3]/div/div[2]/div/div/div[4]/div[1]/div[1]/div[1]/span[1]') # 比较两个对象是否相等 time.sleep(3) self.assertEqual(divtest.text,'您输入的邮箱名格式不正确') def test_login_isButton(self): # 验证自动登录是否默认勾选 divTest=self.driver.find_element_by_id('store1') divTest.click() # 针对布尔类型验证assertTure self.assertFalse(divTest.is_selected()) if __name__=='__main__': # 按测试模块来执行 seite=unittest.TestLoader().loadTestsFromTestCase('SinaTest') unittest.TextTestRunner().run(seite)

 测试固件:

测试固件:初始化setUp(),清理tearDown()

类测试固件:指的是不管一个测试类里面有多少个测试用例,测试固件只执行一次

缺点是执行完一个测试用例后,需要回归到页面的初始化

测试执行:

TestRunner:测试执行指的是针对测试套件或者是测试用例进行执行的过程

测试报告:

TestReport:所有的测试测试用例执行完成后输出的汇总结果报告信息

注意:在测试类里面编写测试方法必须时test开头的

练习一、

 

 

 练习二断言

常用的断言有:

1、比较两个对象是否相等:assertEqual()

2、比较一个对象是否包含另一个对象:assertIn

3、比较两个对象是否为真:asserTure()

4、比较两个对象是否为假:assertFales()

比较两个对象是否相等:assertEqual()

 

 

 比较两个对象是否为真:asserTure()

比较两个对象是否为假:assertFales()

 

 

 

 

 

 

 测试用例执行顺序

在unittest中,测试点的执行顺序是依据ascill码来执行的,也就是说根据ASCII码的顺序加载,数字与字母的顺序为:0-9,A-Z,a-z,所以以A开头的测试用例方法会优先执行,以a开头会后执行。也就是根据数字的大小从小到 大执行的

注意:编写的每一个自动化测试用例都必须是独立的,和其他的测试用例都没有任何的依赖性

编写测试用例注意事项

1、在一个测试类里面,每一个测试的方法都是以test开头的,test不能是中间或者尾部,必须是开头,建议test_

2、每一个测试用例都应该有注释信息,这样在测试报告就会显示具体的测试点的检查点

3、在自动化测试中,每个测试用例都必须的有断言,五断言的自动化测试用例是无效的

4、最好一个测试用例对应一个测试点,不要多个业务检查点写一个测试用例

5、如果涉及到业务逻辑的吃了,最好把业务逻辑的处理方法放在断言前面,这样做的目的时不要因为业务逻辑执行错误导断言也失败

6、测试用例名称最好规范,有约束

7、是否先写自动化测试的测试代码,再使用自动化测试方式写,本人觉得没必要,毕竟能够做自动化测试的都具备了功能测试的剧本水平,所以没有必要把一个业务的检查点写多次,浪费时间和人力成本。

自动化测试流程:

1、先梳理那些模块可以做自动化测试

2、梳理完成后,和相关的的人对下计划以及梳理的结果

3、编写代码时先梳理的测试模块

4、编写完成后和相关人员进行代码评审(代码评审的目的是:测试场景是否考虑周全,测试断言是否合理,代码编写是否合理)

5、编写完成后整合到jekins持续集成平台

6、下个迭代的时候,直接可以应用于产品的回归测试中

参数化

1、参数化: 相同的测试步骤,不同的测试数据,那么这样的测试场景我们就可以使用参数化的解决思路来解决。也就是说使用一个测试用例的代码,执行多个测试场景。参数化需要借助外部的parameterized的库,安装命令:pip3 install parameterized。

2、参数化本质:

针对测试数据进行循环,每次循环的时候对列表中的元素的值一一赋值的过程。

 

 

生成测试报告的是HTMLTestRunner

nuittest生成的测试报告需要使用到都三方的库HTMLTestRunner,把该库放在Python安装目录下的lib目录下

 

 

 

import time
import unittest
import HTMLTestRunner
import os


def getSuite():
	# 获取所有需要执行的测试模块
	suite=unittest.TestLoader().discover(
		start_dir=os.path.dirname(__file__),
		pattern='test_*.py')
	return suite

def getNowTime():
	return time.strftime(
		'%y-%m-%d %H_%M_%S',
		time.localtime(time.time())
	)

def main():
	filename=os.path.join(os.path.dirname(__file__),'report',getNowTime()+'report.html')
	lo=open(filename,'wb')
	runner=HTMLTestRunner.HTMLTestRunner(
		stream=lo,
		title='UI自动化测试报告',
		description='UI自动化测试报告'
	)
	runner.run(getSuite())
if __name__=='__main__':
	main()

 操作步骤

1、先建立一个名为report的文件夹

2、运行程序

3、运行完之后再report的文件夹中会有一个新的文件(我们是以现在时间来命名的)

4、以HTML的格式打开文件(此时我们选择使用chrome浏览器打开)

 

 

 

posted @ 2022-04-11 20:15  挣大钱  阅读(166)  评论(0编辑  收藏  举报