6.30 UI自动化测试(4)

UI自动化测试(4)

UnitTest测试框架

测试金字塔模型

 

白盒测试

在软件架构的层面来说,测试最核心的步骤就是在软件开发过程中。就软件本身而言,软件的行为或者功能是软件细节实现的产物,这些最终是交付给用户的东⻄。所以在早期执行测试的系统有可能是一个可测试和健壮的系统,它会带来为用户提供的功能往往是让人满意的结果。因此给予这样的⻆度,开始执行测试的最佳方法是来自源代码,也就是软件编写的地方以及开发人员。由于源代码是对开发人员是可⻅的,这样的一个测试过程我们可以称为白盒测试。

自动化测试用例

在自动化测试过程中,编写的每一个测试用例都是需要借助单元测试框架的,那么在Python技术栈中,单元测试框架主要是unittest和Pytest,Java技术栈里面主要使用的是junit和testng。

不管基于什么的测试框架,自动化测试用例的编写都需要遵守如下的规则,具体总结如下:

 

设置:做一件事的前置动作,也就是初始化

执行:测试步骤(具体干一件事的操作步骤)

验证:断言,验证做一件事的结果是否正确

清理:后置动作

unittest是单元测试框架,使用它的注意事项

1、测试类建议以Test开头

2、每个测试类必须要继承unittest模块中的TestCase类,这样就可以直接调用里面的方法

3、在测试类里面编写的方法叫测试方法,测试方法必须是以test开头的

 

UnitTest测试框架

UnitTest组件

unittest是属于Python语言的单元测试框架,它的核心组件具体可以总结为如下:

 

测试用例:就是测试类里面编写的测试方法

测试固件:初始化和清理,使用到的方法分别是setUp()和tearDown()

测试套件:就是测试用例的集合,在一个测试套件可以有很多的测试用例,它的英文单词是TestSuite

测试执行:TestRunner,执行测试套件或者测试用例

测试报告:TestReport,就是执行所有测试用例后的结果信息

百度测试用例实战:

测试百度主页的title、URL以及元素属性

 

测试用例中的断言方式:

assertEqual():比较的是两个对象的==关系

assertIn():比较的是两个对象的包含关系

assertIs():比较两个字符串的内存地址

assertTrue()

assertFalse()

 

测试固件:

1、setUp() and tearDown():在一个测试类里面,有多少个测试用例,它就会被执行多少次

2、setUpClass() and tearDownClass():是类方法,不管测试类方法里面有多少测试用例,它只会执行一次

 

测试固件的分离

使用继承的思想,把测试固件分离,这样的好处是只需要在一个地方维护测试固件,而不是多个地方维护。其他的测试类只只需要继承测试固件就可以使用了。

在一个完整的自动化测试用例中,比如在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()

 

生成报告添加备注如下:

posted @   重逢Fate  阅读(44)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
点击右上角即可分享
微信分享提示