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浏览器打开)