2023年11月30日发(作者:)
技术
分析
IGITCW
Technology Analysis
基于Unittest的Python测试系统
王春明
(英伟达半导体科技(上海)有限公司,上海 200120)
其成本已经超过硬件,因此,完善的软件测试是保证软件质量的一个重要手段。随着随着软件规模的扩大,
摘要:
Python语言的快速发展与普及,其在软件测试中发挥着重要的作用。文章介绍了Python语言自带的Unittest框架完成自动化测
试框架的搭建,并结合一些些测试实例,介绍了Unittest框架的自动化测试的设计方法,从而提高测试效率和质量。
[1]
自动化测试;Python;Unittest
关键词:
10.3969/.1672-7274.2023.03.022
doi:
TP 31 A 1672-7274(2023)03--04
文献标示码:文章编码:中图分类号:
0066
Python Test System Based on Unittest
WANG Chunming
(Nvidia Semiconductor Technology (Shanghai) Co., Ltd., Shanghai 200120, China)
Abstract: With the development of software technology, its cost has exceeded the hardware, and most of the
hardware are running software. It is a key problem to ensure software quality through perfect software testing. With
the rapid development and popularization of the artificial intelligence language Python, it is very important to study
the automatic test of Python language system. This article introduces the Python language built-in Unittest framework
for building test automation. With some test examples, this paper introduces the design method of automatic test of
Unittest framework, so as to improve the efficiency and quality of test.
Key words: automatic test; Python; Unittest
0 引言
随着软件规模(如代码行数)的不断增加,测试的
成本也与日俱增。对于现代主流的迭代式开发过程,
因为每个迭代都推出一个更加完善的软件子集,所以
每次迭代中不仅要对新增功能进行测试,还需要对上
一个迭代原有功能进行了回归测试。全部使用手工测
试则效率低下(特别是在进行大量回归测试时)且存
在人为失误的可能,自动化测试应运而生。本文介绍
了基于Python的Unittest框架的自动化测试。
[2]
(3)独立脚本测试:线性脚本是一种非结构化
的脚本,它需要能直接支持各种语言,测试脚本与被
测系统之间存在深度耦合,所以这类脚本随着被测
软件的各种变化,脚本被迫经常变化,维护成本高。
例如,直接捕获UI上的操作形成的测试脚本就属于
线性脚本,其容易受到UI变化的影响,线性脚本不
大适合大型软件的自动化测试。结构化脚本具有完
善的结构,比如拥有循环和函数调用等功能,其编写
难度较大,但可维护性比较好,在一定程度上比较好
地适应软件变化而无须修改测试脚本。
(4)录制回放:在早前的软件测试中,有录制回放
的方式,这种方式通过记录用户界面(UI)上的用户操
作并且重复执行来完成测试,不需要编程技巧。不过一
旦用户界面变化,就会使录制下来的测试用例失效。
好的测试脚本不仅要易于使用,还必须具有高可
靠性和可维护性,最重要的是能在回归测试中被重复
使用。
目前自动化测试不能完全覆盖大多数项目,或者
说对于无法自动化的部分必须进行手工测试。而在自
动化的程度方面,也不是100%,最常见的是将编写并保
存的测试脚本用于回归测试。EvoSuite等工具也可以自
动生成测试用例,并且有一定智能自动判断测试用例执
1 自动化测试方法简介
1.1 自动化测试的技术
随着软件自动化测试技术的不断发展,出现了大
量测试方法,主要包括以下几种。
(1)关键字驱动:关键字描述数据参与测试的方
式,使得一个测试用例模板可能执行多种测试,相当
于实际完成了多个测试用例的工作。
(2)数据驱动:建立模块化(或者统一)的测试
脚本框架,然后使数据和脚本分离,对相似功能使用
一段代码统一测试。测试用例的维护工作可以分成由
程序员编写统一的测试脚本框架和由测试人员负责生
成测试数据与确定测试结果是否正确两部分。
66
DIGITCW
2023.03
Copyright©博看网. All Rights Reserved.
Technology Analysis
行是否正确,是自动化程度比较高的测试工具。
[3]
技术分析
TestRunner、TestFixture和TestLoder(),我们可以使
用它提供的各种断言方法来判断测试用例是否通过,
也能自动生成HTML格式的测试结果报告。
(1)TestCase(测试用例):TestCase类的实例
包含测试用例。测试用例可以看作程序的一次完整
执行,例如,使用setUp方法完成测试前准备环境的搭
建,使用run方法执行测试脚本(最后用断言判断测试
是否正确),以及使用tearDown方法在测试后对环境
进行还原,方便下一个测试用例的执行。
(2)TestSuite(测试套件):一个TestSuite可以包
含多个测试套件和测试用例,可以把TestCase类比作
计算机上的文件,那么TestSuite就是计算机文件系统
中的目录,也可以把TestSuite理解成TestCase的集合。
我们针对软件某一部分进行测试时很可能需要执行一
组测试用例,这时设计一个TestSuite把这一组测试用
例包括其中就是一个很好选择。
(3)Test runner:该类的对象将执行测试用例,
它的run(test)方法会触发TestSuite/TestCase中的各个
测试用例。
(4)TestLoader:将TestCase类实例化对象添加
到TestSuite对象中。该类拥有多个loadTestsFrom__()
方法,负责寻找所有TestCase类,并对这些TestCase
类生成它们的对象,然后把这些对象添加到某个
TestSuite对象中。
(5)Test fixture:测试用例执行前,创建测试
环境;测试用例执行后,恢复测试环境,以利后续测
试用例执行。可通过重写TestCase类中的setUp()和
tearDown()方法来实现
[4]
。
DCW
1.2 自动化测试的类型
根据软件测试的不同类型,自动化测试也可分
为多种类型,主要有自动化单元测试(单元测试阶
段),自动化接口测试(接口测试阶段)和自动化UI
测试(UI测试阶段)。
(1)自动化单元测试。单元测试重点在于根据代
码的实现进行白盒测试。要求测试工程师具备编写
代码能力。不同的开发环境下对应的单元测试框架也
不同,Python有unittest、Pytest等。基于这些测试框
架,再编写一些自动化测试(脚本),就可以进行自动
化单元测试了。
(2)自动化接口测试。分成三种接口自动化测试
用例:分别是单接口、场景和差异化自动化测试用例。
(3)自动化UI测试。目前常见的Web端或者App
端软件,用户都是基于页面元素的识别和定位来操
作,UI自动化测试必须记录和模拟这种用户行为来
进行测试。自动化UI测试的常用工具有Appium、
Selenium、Pytest等测试管理框架
[4]
。
2 自动化测试工具简介
Python支持面向对象和动态数据类型,是一种
非常灵活高效的解释型语言,具有较好的跨平台性、
开发效率高(或者说同样行数的代码Python比C++
能做更多事情)、开源并且支持非常丰富的第三方库
(Python语言又被称为胶水语言)等特点,成为各大
互联网公司软件开发中最受欢迎的开发语言之一,人
工智能的兴起,Python又被广泛应用于数据处理、网
络爬虫、网页开发以及人工智能等领域,成为一种人
工智能语言。
根据软件、开发平台和测试需求的不同,人们开发
了各种自动化测试工具。而基于Python的自动化测试
框架更是非常多,有selenium、Unittest等。
4 Unittest编写Python测试代码
使用Unittest编写Python的测试代码。
(1)编写一个继承Unittest模块中的TestCase类
的Python测试类。
(2)在该测试类中定义名字以test开头的没有参
数的测试方法(通常一个测试用例就是一个测试方
法)。测试方法中会使用某种参数调用被测试代码,
相当于执行了一个测试用例,最后使用断言自动检验
测试用例执行结果是否正确。TestCase类中包括大量
这类断言方法。
(3)编写脚本去执行()方法,它会
实例化所有TestCase的子类,并运行这些对象中的所
有测试用例。
3 Unittest框架
框架是一种具有通用性的半成品,我们通常在
框架上继续开发产品以提高效率。Unittest框架是
Python自带的单元测试框架,它属于Python的标准
库,无须单独安装即可使用。Unittest有点类似于Java
的JUnit框架。Unittest框架不仅适用于单元测试,也
可以用于集成测试或者UI测试(如网页自动化测试用
例的生成和执行)。
Unittest下有5个重要概念:TestCase、TestSuite、
Copyright©博看网. All Rights Reserved.
2023.03
数字通信世界
67
技术
分析
IGITCW
Technology Analysis
unittest中提供的断言方法有以下几种:send_keys('')
⊙ assertEqual(a, b)和assertNotEqual(a, b)返回
值是a是否等于b。
⊙ assertTrue(x)和assertFalse(x)的返回值是x的
逻辑真假。
⊙ assertIs(a, b)和assertIsNot(a, b)的返回值是a
是否就是b。
⊙ assertIsNone(x)和assertIsNotNone(x)的返回
值是x是否为空值。
⊙ assertIn(a, b)和assertNotIn(a, b)的返回值是
元素a是否在集合b中。
⊙ assertIsInstance(a, b)和assertNotIsInstance(a,
b)的返回值是对象a是否是类b的实例。
_element_by_id('mylogin').
click()
#获取测试结果
_t_content()
(3)
name = r.find_element_by_
id('sbaidentity')
#检查测试结果
if name == 'wangchunming@263.net':
print('成功登录')
else:
print('失败登录')
def test_a2(self):
#通过输入错误密码形成新的测试用例
……
_element_by_name('mypassword').
send_keys('mypassword')
……
#检查测试结果
if name == 'wangchunming@263.net':
print('登录成功')
else:
print('登录失败')
def test_a3(self):
#输入正确用户名、密码。
……
_element_by_name('myemail').
send_keys('wangchunming')
_element_by_name('mypassword').
send_keys('wrongpassword')
……
#检查结果
if name == 'wangchunming@263.net':
print('成功登录')
else:
print('失败登录')
def tearDown(self):
#关闭为测试打开的浏览器
()
5 Unittest测试263邮箱登录案例
这是很简单的测试263邮箱登录的测试程序,主
要包括以下几个步骤。
#首先设置一些参数:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#其次导入所需要的库:
from selenium import webdriver
import unittest
import time
#创建继承了TestCase类的测试类。
class mailboxLogin(se):
#setUp方法建立测试用例执行环境
def setUp(self):
r = x()
url = 'mail.263.net/'
(url)
(3)
#一个测试用例就是一个方法
def test_a1(self):
_("myframe")
#获取输入的用户名、密码并且模拟单击登
录按钮,用户名及密码为空
_element_by_name('myemail').
send_keys('')
r.find_element_by_name('mypassword').
68
DIGITCW
2023.03
Copyright©博看网. All Rights Reserved.
Technology Analysis
if __name__ == "__main__":
#运行所有测试用例
()
利用Firefox的Webdriver,我们可以用脚本程序
模拟用户在浏览器上的操作。SetUp建立测试环境,打
开浏览器并进入网页,TearDown关闭浏
览器,中间的每个测试方法都是一个测试用例,进行
一次邮箱登录操作,最后通过检查Web服务器的返回
结果来判断是否符合预期输出,并给出测试用例是成
功还是失败的输出。
技术分析
入数据库。控制台可读取数据库数据并生成GUI向用
户展示这些数据。自动化测试流程大致如下:由测试
脚本连接主机获取相关信息,同时读写数据库,通过
脚本中编写好的断言判断测试用例是否正确执行。
DCW
7 结束语
随着软件规模的扩大,测试成本随之大幅增长,
提高测试质量、降低测试成本的一个关键方法就是采
用先进的测试技术和工具。自动化测试是行业的发展
趋势,其显著特点是可靠性强、效率高等,并且测试过
程可保存,随时可以重新测试(例如回归测试)。而编
写并管理大量测试脚本和数据是目前实现软件测试自
动化的最简单易行的方法。本文分析并研究了Python
语言自带的Unittest框架实现自动化测试的方法和实
例,在提高测试质量的同时降低测试成本,特别是能
够全自动化地完成后续的回归测试。■
6 主机安全监控系统中客户端的自动化
测试实例
如参考文献[5]所述,通过Python语言自带Unittest
框架完成自动化测试框架搭建,实现对主机安全监控系
统客户端的自动化测试。通过脚本操纵主机端口开启和
关闭以及添加和删除帐号,检验客户端是否能够捕捉到
该操作,以此来判断测试用例是否正确执行。
首先完成自动化测试框架的设计,相关模块主要如下。
(1)Unittest框架。用于编写和保存测试用例脚本。
(2)PyYaml:PyYaml是Python中的处理Yaml格
式数据的库。对比JSON语言,Yaml存储配置信息,功
能更强大且使用更简洁。
被测试对象主机安全监控系统远比网站复杂,分
成控制台、服务端、客户端三部分。客户端可获取主机
配置信息、安全信息等。服务端处理数据并将数据写
参考文献
[1] 丛春雨.Python语言在自动化测试系统设计中的应用研究.中国新通信
[J].2020,22(10):119
[2] 王娜.基于Python的接口自动化测试框架设计.电脑知识与技术[J].
2022(Vol 16)No 12:246-248
[3] 付玉珍.面向对象单元测试用例自动生成工具对比分析.电脑知识与技
术[J].2020(16).02:53,54,60.
[4] 黄建军,李宥谋,刘婧,周欢.基于Python语言的自动化测试系统的设
计与实现[J].2017,40(04):39-43
[5] 蒋程燕,孟令琴.基于Python语言的自动化测试应用实例.工业控制计算
机》[J].2021 Vol 34(10):109,110,113
(上接第65页)
不影响无线网络性能的情况下提升数据传输速率,同
时该架构中所设计的接收天线具有较好的抗辐射性
能,从而提高了无线网络信号覆盖范围;最后通过仿
真实验证明了本文中所提出的波形一体化设计方案可
以提高无线通信数据传输速率。本文只是基于信息同
步传输理论对其实现进行一个初步描述,并没有对其
进行深入研究和分析。■
法[J].中国电机工程学报,2022,42(18):6803-6812.
[2] 倪志超.水下无线能量与信息同步传输系统设计研究[D].哈尔滨:哈尔
滨工业大学,2020.
[3] 周美华.信息与能量同步传输模式下认知无线电网络资源优化配置[D].
秦皇岛:燕山大学,2020.
[4] 廖翔.基于能量和信息同步传输的引信高精度动态开环控制技术[D].南
京:南京理工大学,2019.
[5] 周静,杨东.同步无线能量与信息传输网络研究现状[J].电子科学技
术,2016,03(03):267-271.
[6] 李利.智能电网中信息传输网络时间同步的研究[D].广州:广东工业大
学,2016.
[7] 鄢茂林,蒋子刚,涂卫红.跳频通信同步信息传输的抗干扰策略[J].电
讯技术,2009,49(04):41-44.
参考文献
[1] 雷珂林,刘福鑫.基于频分复用的多端全双工无线能量信息同步传输方
Copyright©博看网. All Rights Reserved.
2023.03
数字通信世界
69


发布评论