6.30 UI自动化测试(4)
UI自动化测试(4)
测试金字塔模型
白盒测试
在软件架构的层面来说,测试最核心的步骤就是在软件开发过程中。就软件本身而言,软件的行为或者功能是软件细节实现的产物,这些最终是交付给用户的东⻄。所以在早期执行测试的系统有可能是一个可测试和健壮的系统,它会带来为用户提供的功能往往是让人满意的结果。因此给予这样的⻆度,开始执行测试的最佳方法是来自源代码,也就是软件编写的地方以及开发人员。由于源代码是对开发人员是可⻅的,这样的一个测试过程我们可以称为白盒测试。
自动化测试用例
在自动化测试过程中,编写的每一个测试用例都是需要借助单元测试框架的,那么在Python技术栈中,单元测试框架主要是unittest和Pytest,Java技术栈里面主要使用的是junit和testng。
不管基于什么的测试框架,自动化测试用例的编写都需要遵守如下的规则,具体总结如下:
UnitTest测试框架
UnitTest组件
百度测试用例实战:
测试用例中的断言方式:
assertEqual():比较的是两个对象的==关系
assertIn():比较的是两个对象的包含关系
assertIs():比较两个字符串的内存地址
assertTrue()
assertFalse()
使用继承的思想,把测试固件分离,这样的好处是只需要在一个地方维护测试固件,而不是多个地方维护。其他的测试类只只需要继承测试固件就可以使用了。
在一个完整的自动化测试用例中,比如在UI的自动化测试用例中,我们的测试用例是按照业务模块来进行划分的,那么以为着我们需要编写很多的模块,但是就存在重复的代码,比如我们针对百度产品的测试,不管是测试什么模块,测试固件这部分的代码每个测试模块都是一样的,这样就导致很多的重复的代码,重复必然就带来测试效率的低下的问题,举一个很简单的问题,比如需要修改测试的地址,就需要修改很多的测试模块,但是如果把测试套件分离出来,我们这需要修改一个地方就可以了,这样我们的测试效率就提升了一点,毕竟效率的提升是需要做很多的,不可能一点就进行大幅度的提升的。分离测试套件的思想其实很简单的,就是使用了继承的思想来解决这个问题,我们把测试固件分离到init.py里面,代码具体如下:
新浪邮箱测试用例实战:
测试输入三种不同的用户名、密码下的提示信息
class Init(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_username_null(self):#输入为空时的提示信息
'''输入为空时的提示信息'''
self.driver.find_element(By.LINK_TEXT,'登录').click()
divText=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]')
self.assertEqual(divText.text,'请输入邮箱名')
def test_email_format(self):#输入错误格式时的提示信息
'''输入错误格式时的提示信息'''
self.driver.find_element(By.ID,'freename').send_keys('likai')
self.driver.find_element(By.ID,'freepassword').send_keys('541')
self.driver.find_element(By.LINK_TEXT,'登录').click()
divText=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]')
self.assertEqual(divText.text,'您输入的邮箱名格式不正确')
def test_user_passwd_error(self):#输入错误名或密码时的提示信息
'''输入错误名或密码时的提示信息'''
self.driver.find_element(By.ID,'freename').send_keys('likai@sina.com')
self.driver.find_element(By.ID,'freepassword').send_keys('541')
self.driver.find_element(By.LINK_TEXT,'登录').click()
t.sleep(3)
divText=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]')
self.assertEqual(divText.text,'登录名或密码错误')
if __name__ == '__main__':
unittest.main()

参数化:
当一个测试场景,它的测试步骤相同,测试数据不一样的时候,那么就可以使用参数化的思想来解决。在unittest测试框架中,参数化需要借助第三方的库parameterized
运用参数化的思想将新浪微博测试用例简化:
import unittest
from selenium import webdriver
from selenium.webdriver.common.by import By
import time as t
from parameterized import parameterized,param
class Init(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()
@parameterized.expand([
param("","","请输入邮箱名"),
param("fsaf","asds","您输入的邮箱名格式不正确"),
param("fsad@sina.com","sds","登录名或密码错误")])
def test_user_passwd_error(self,username,password,result):
'''新浪登录错误提示信息验证'''
self.driver.find_element(By.ID,'freename').send_keys(username)
self.driver.find_element(By.ID,'freepassword').send_keys(password)
self.driver.find_element(By.LINK_TEXT,'登录').click()
t.sleep(3)
divText=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]')
self.assertEqual(divText.text,result)
if __name__ == '__main__':
unittest.main()

生成测试报告
获取要执行的测试模块(套件)
测试执行的原则: 测试执行的原则自动寻找到被执行的测试模块,然后根据测试模块寻找到测试类中符合要求的测试方法来进行执行
导入第三方库、定位、运行生成测试报告写入指定目录下
unittest生成测试报告需要借助第三方的库HtmlTestRunner.py的文件,具体代码如下:
import os
import HTMLTestRunner
def allTests():#获取要执行的测试模块
suite=unittest.TestLoader().discover(
start_dir=os.path.dirname(__file__),#测试模块的路径
pattern='test_*.py')#通过正则方式加载所有的模块测试
return suite
print(allTests())
def run():#使用第三方库定位,写入生成报告
filename=os.path.join(os.path.dirname(__file__),'report','index.html')
fp=open(filename,'wb')
runner=HTMLTestRunner.HTMLTestRunner(
stream=fp,
title='UI自动化测试',
description='ui test')
runner.run(allTests())
if __name__== '__main__':
run()

生成报告添加备注如下:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南