推荐星级:
  • 1
  • 2
  • 3
  • 4
  • 5

基于Python的测试驱动开发框架

更新时间:2019-12-24 12:16:31 大小:2M 上传用户:songhuahua查看TA发布的资源 标签:python 下载积分:1分 评价赚积分 (如何评价?) 打赏 收藏 评论(0) 举报

资料介绍

本文首先介绍了测试驱动开发,继而介绍了测试模式,描述了测试驱动开发的优势、一般步骤、测试的原则和对一般开发人员的要求,最后比较详细地介绍了几种基于Python的测试框架。


部分文件列表

文件名 大小
基于Python的测试驱动开发框架.pdf 2M

部分页面预览

(完整内容请下载后查看)
|
|
|
科 学 技 术  
Python  
基于  
的测试驱动开发框架  
朱道雨  
(中国船舶重工集团公司第 723 研究所 江苏·扬州 225101)  
摘
要 本文首先介绍了测试驱动开发,继而介绍了测试模式,描述了测试驱动开发的优势、一般步骤、测试的原则和  
对一般开发人员的要求,最后比较详细地介绍了几种基于 Python 的测试框架。  
关键词 测试驱动开发 Python 测试框架  
中图分类号:TP3  
文献标识码:A  
1 测试驱动开发介绍  
程序片段,分离编码和测试,并定义了探索性测试,强调单元  
测试和集成测试的重要性。  
测试驱动开发(TDD)是一种不同于传统开发流程的新型  
的开发方法,采取了很小的增量式开发方式,强调测试在软件  
开发过程中的作用。TDD 是一种编码之前进行单元测试的软  
件开发思想。TDD 先行定义了需求,扩大测试覆盖率,从而推  
进整个开发过程。其编写的代码简洁、健壮且高质量,加快软  
件开发。  
3 TDD 的优势以及一般步骤  
3.1 TDD 优势  
TDD相较于传统的结构化开发过程方法,具有以下优势:  
3.1.1 更快更好地迎接需求变化  
根据客户需求编写测试用例,关注用户反馈和以使用者  
的角度对功能的过程和接口进行设计,可及时响应需求变更,  
更符合后期开发的需求。同时覆盖完全的单元测试,提高了  
代码的可靠性。  
2 测试模式介绍  
针对软件开发典型的瀑布模型,其是一种带有部分反馈  
的自上而下的开发模式,对文档支持要求高。该模型按照阶  
段划分了检查点,最终产品只能在后期才能看到最终结果,测  
试阶段一般占一半时间。软件测试和软件开发过程一样遵循  
软件工程原理,下面以 V 模型和 X 模式为例对测试与开发之  
间的关系进行说明。  
3.1.2 明显地缩短了设计决策的反馈循环  
基于易测试和测试独立性的要求,更多地依赖于接口,通  
过实现松耦合的设计,提高系统的可扩展性和抗变性;同时对  
其功能的分解、使用过程、接口都进行了设计。  
3.1.3 降低了后续测试的成本  
2.1 V 测试模型  
V 模型和瀑布开发模型一样,存在需求分析、概要设计、  
详细设计、代码编码等阶段,这些过程都需考虑对应的测试工  
作,同时设计测试用例、编制测试计划。V 模型明确标明了测  
试的不同级别,清楚地描述了测试阶段和开发过程期间各阶  
段的对应的关系。需求分析产生的错误直到验收测试才能发  
现是其最大的局限性。  
TDD 先考虑代码的使用需求――功能、过程、接口等,再  
确认需求是无歧义的、可验证的。首先将测试提到编码之前  
并频繁地运行所有测试,尽早地发现或避免错误,不断地重构  
代码并消除重复设计,提高代码的重用,极大地提高代码的健  
壮性。  
3.1.4 提供持续的回归测试  
2.2 X 测试模型  
TDD能帮助开发人员持续地跟踪软件生命周期内的全部  
状态,并快速地反馈开发人员,使开发人员无需过分担心不可  
预知的异常并大胆地实施重构。  
3.1.5 提供合格的文档  
TDD 所产生的单元测试代码是最完美的开发者文档,含  
有 API 如何使用的信息,同时与最新的代码保持同步。  
3.2 TDD 的一般步骤  
(1)明确当前主要完成的功能,并形成电子或者书面的记  
录表单;  
(2)快速地编写此功能的测试用例;  
(3)运行测试,发现新增的测试不能通过测试;  
(4)改动测试程序,尽快让测试程序通过运行  
(5)重构已完成的代码,消除重复设计,优化程序结构,并  
保证测试通过  
(6)循环完成所有功能。  
图 1:X 模型图  
3.3 测试原则  
如图,X 模型更详细地描述了详细设计和编码阶段的开  
发行为,分离单程序片段的编码和测试,直到集成为可执行程  
序,然后测试这些可执行程序。已通过集成测试的成品既可  
封装并提交给用户,也可作为更大规模集成的一部分,针对多  
(1)测试隔离,不同代码的测试相互隔离,对单块代码的  
测试应只考虑该代码的测试,  
(2)测试列表,在软件开发的任意阶段,添加新功能需求  
时,需将相关功能点添加到测试列表中,不断地完成测试用例,  
260  
2018  
20 /7  
期 月(中)—  
— 科教导刊(电子版)·  
年第  
|
|
|
科 学 技 术  
并重构。  
(3)测试驱动,在完成代码类、功能设计前,首先编制测试  
包含回溯。  
4.3 nose 系列  
代码,考虑如何使用与测试,继而设计编码。  
由于扩展自 unittest 的扩展,nose 也支持类似于 setUp、set-  
UpClass、setUpModule 的测试环境创建方式,所以 python 的测  
试更加简单。nose 自动发现测试代码并执行,nose 提供了大量  
(4)测试与断言优先,在编写代码之前编写测试,在编制  
代码过程中,首先编写断言语句,再编写辅助语句。  
(5)可测试性,代码设计过程必须具有较强的可测试性, 的插件,比如测试输出的 xUnitcompatible,覆盖报表等等。  
有助于提高代码的内聚性和复用。  
路径、模块(文件)、类、函数的名字若匹配上testMatch,那  
就会被认为是一个用例,另外所有 unittest.TestCase 的子类都  
会被当做测试用例。nose 主要检查一个测试用例的文件夹,  
否则会忽略此文件路径。显式地避免某个对象被当做测试用  
例的方法是:给其或其容器添加一个 _test_ 属性,并且运算结  
(6)及时重构,无论是功能代码还是测试代码,对结构不  
合理、重复的代码,都要进行及时的重构。  
4 测试框架  
4.1 unittest 测试框架  
(
)
该测试框架中最核心的概念为:test case,test suite,test  
runner,text fixture。unittest 提供了 TestCase 基类来构造单元  
测试用例,在构建测试用例的时候,使用 setUp 方法初始化测  
试环境,tearDown方法执行扫尾结束工作并还原测试环境,这  
类似于上下文管理器,setUp 和 tearDown 每次必须运行一次  
(如图 2)。  
果不为 True,只要 bool _test_ == False 即可。  
nose可不使用特定的格式、不需要一个类容器,甚至不需  
要 import,但 nose 测试用例的命名仍需以 test_开头。  
4.4 pytest  
作为 unittest 的替代工具,pytest 是一个语法简单且功能  
丰富灵活的测试框架。相比  
unittest,实现相同的测试功能 py-  
,
test 更简洁高效;支持简单的单元测试和复杂的功能测试,支  
持参数化,支持重复执行失败的case,支持运行由nose、unittest  
编写的测试 case。  
pytest 创建测试环境(fixture)的方式,通过显式指定scope  
参数来选择装饰器。一个 fixture 函数的类型一旦定义即确  
定,对于 scope=’function’的 fixture 函数会在测试用例的前后  
分别调用 setup/teardown。测试用例的参数只负责引用具体的  
对象,并不关心作用域;同时 setup/teardown 语法与 unittest 的  
兼容性不如 nose 高。fixture 在参数列表中可以明了地知道哪  
些tests 使用了一个资源,无需人为地创建类,只需分离fixture  
应用。而对于一个资源而言,teardown 代码是紧密地和 setup  
代码耦合的。常常需在资源 setup 代码的位置处指定资源的  
生命周期的范围来节省测试时间。  
图 2:测试流程图  
TestLoader 用来加载 TestCase、TestSuite,可使用 LoadTes-  
tsForm 方法,创建测试实例,继而 add 到 TestSuite 中,返回一  
个 TestSuite 实例。使用 TextTestRunner 执行测试用例,其中,  
测试结果保存到 Result 中,包括运行的用例数量、成功与失败  
信息。Fixture 完成测试环境的搭建和销毁。  
一般而言,测试类以 Test 开头的类,但不能带有 _init_方  
法;测试文件以 test 开头或者结尾的文件;测试函数以 test 开  
头。pytest 会自动进行收集测试用例,在 pytest.ini 配置文件中,  
python_classes 指定测试类和测试文件、python_functions 指定  
测试函数。在 setup.cfg 文件中 norecursedirs 指定禁止目录。  
4.5 unittest2 测试框架  
通过命令行或者main函数来启动单元测试,main会调用  
run 来执行,当 Runner 执行时,将执行结果输出到控制台或文  
件,通过设置 verbosity 参数控制执行结果的输出。unittest 框  
架比较笨重且难以扩展,必须在 TestCase 子类中编写所有的  
单元测试和断言方法,必须为测试活动建立测试套件。  
4.2 doctest 测试  
unittest2 测试框架是 unittest 的升级版,改善了 API 以及  
诊断语法。由于篇幅所限,只说明一点:可使用import unittest2  
as unittest 在 unittest 与 unittest2 之间进行切换。  
doctest测试框架在文档字符串(docstring)内嵌注释,这些  
注释将各单元模块的期望结果予以表达,字符串如同交互式  
shell 会话搜索 Python 代码,继而尝试执行并验证结果。测试  
用例的位置必须放在整个模块文件的开始部分或紧接声明语  
句的下一行。设置 verbose 参数用于控制是否输出详细信息,  
默认不输出任何东西,除非测试失败。  
5 结束语  
构建“TDD友好”的系统,需要进行分层架构,建立标准一  
致的系统,操作环境可控,努力创建高内聚低耦合的结构,在  
TDD 实践过程可实现代码的低层设计。而 TDD 并不能直接  
提高设计能力,它要求开发人员思想上重视测试,掌握重构与  
设计模式等知识,从而间接改善软件设计。  
当不带任何参数运行 test_basic.py 时。将 test_basic 导入  
到脚本的命名空间中,可导入其他希望要测试的模块。testmod  
函数去遍历模块本身、模块函数及其所有文档字符串,以找出  
所有类似交互式 shell 会话的内容。  
参考文献  
doctest 在解析显式会话时,将空行作为会话结束来处理。 [ ]  
(
) [  
]
1
Beck,K.测试驱动开发 中文版 M .孙平平译.北京:中国电力出版社, 2004.  
[ ]  
(
)[  
]
2
雨痕.Python3 学习笔记 上卷 M .北京:电子工业出版社,2018.  
可利用文档字符串自定义的函数来解决此问题。一方面由于  
文档字符串毕竟是字符串换码,所以要注意\n 这样的序列被  
扩展。另一方面由 doctest 处理的文档字符串可能会在其内部  
[ ]  
3
[ ]  
Matthew,K.Python机器学习实践,测试驱动的开发方法 M .刘江一,上官明  
乔,白皓,刘旭威译.北京:机械工业出版社,2017.  
261  
2018  
20 /7  
期 月(中)—  
— 科教导刊(电子版)·  
年第  

全部评论(0)

暂无评论

上传资源 上传优质资源有赏金

  • 打赏
  • 30日榜单

推荐下载