问题:
如果有多个共享一些通用对象的测试模块,这些对象在用于实现测试模块的几个TestCase类中式重复的。你想要复用这些对象,而不是复制它们
情景:
这个问题在编写客户端或端到端测试的时候尤为常见-------就是那些为整个系统而不是为某个类所做的测试。偶尔Junit用户---那些几乎完全依赖JUnit作为测试驱动的开发工具的人---会忘记那些从来不使用Junit的、非测试驱动程序员,因为JUnit提供了一个易于使用的Java框架来编写测试程序。说这些是因为一个测试驱动的程序员会说:“如果你有一个这么大的测试模块,那你的测试代码就太大了,必须要修改测试代码使其只专注于系统的一个方面。如果你这样做了,那问题就会得到解决”。其实说的没错,可是这话是典型的数学家的语言:专注,精确,然而毫无用处。
如果能够精简测试模块或者能够找出其中没有被所有测试所共享的部分,那就更好了:我们更喜欢简单的测试用例层次结构。如果已经无法将事情简化-----或者是看不出该如何做--那也至少应该试着将通用的测试模块移到一个地方。
技巧:
解决这个问题的技巧说来很简单:尽管编写的是测试程序,但它们还是用方法和对象实现的,所以将其当作方法和对象来看待。一个从一组类中抽取重复行为的办法是,应用抽取超类的重构方法创建一个类层次结构。具体步骤如下:
1. 选择两个有通用测试模块的测试用例类。
2. 创建一个新的TestCase的子类,它是有重复的测试模块的测试用例类的超类。在这里,我们将这个新类叫做BaseFixture,这个是各人自己取的。
3. 将BaseFixture类声明为抽象类,没有必要创建这个类的实例
4. 修改测试用例类代码,使其继承自BaseFixture而不是直接继承TestCase。
5. 将重复的测试模块复制到BaseFixture中-----就是说,复制参数域和setUp()方法中初始化参数域的代码。可能需要修改参数域,将其声明成受保护的而不是私有的,否则测试用例类就不能使用它们。可以将参数域封装在一个受保护的get方法里面,但是在这个例子中我们觉得没必要这样做。
6. 从每一个测试用例类中删除测试模块参数域,从setUp()方法中删除已经移到BaseFixture中的代码。
7. 在每个测试用例类的setUp()方法的开始加上一行super.setUp()。
8. 现在可以重新编译运行此测试程序,来验证其行为并没有改变。可以对尽可能多的共享通过测试模块对象的测试用例类重复上述步骤。
另外在验证了做完上述步骤没有带来任何问题以后,要看看那些setUp()方法中是否可以删除一些空的或只有一行super.setUp()的方法。
讨论:
可以将这个诀窍归结为:“抽取测试用例类的超类,将其声明为抽象的因为没有理由去实例化它。”
1. 通过将重复的测试代码移到一个超类中来消除重复性事一个好主意
2. 在重复代码出现之前,我们一般想不到它。
最后有个地方要注意:必要的时候调用方法super.setUp()和super.tearDown()。从TestCase类直接派生子类的时候,并不需要担心这些,因为超类的实现中什么也没有做;但是现在你的超类的每个方法的实现中都可能有很重要的部分。这是一个常犯的错误-----一个我们所有人都会犯的错误,并将持续到我们的编程生涯的结束的那一天------所以不必为此感到难过。
分享到:
相关推荐
软件业企业管理软件测试中如何提取一个测试层次结构测试用例(TestCase)是为某个特殊目标而编制的一组测试输入、执行条件以及预期结果,以便测试某个程序路径或核实是否满足某个特定需求。测试用例(TestCase)目前...
维基百科类目层次结构提取是一项重要的数据挖掘任务,它涉及到对维基百科庞大的信息库进行有组织的、结构化的访问。在这个过程中,我们可以利用HTMLParser这个Java库来解析HTML文档,提取出维基百科页面中的类目链接...
总的来说,“HED 深度学习边缘提取 C++接口测试程序”是一个将深度学习应用于图像处理的实际示例,涵盖了深度学习理论、特定算法(HED)、编程接口(C++)和框架(Caffe)等多个方面的知识。对于希望在计算机视觉...
5. **JVT Test Model (JM)**:由H264标准制定者联合视频团队开发,JM是一个官方的参考软件,用于测试编码器性能和一致性。它包含了各种测试序列,这些序列经过精心设计,能够揭示编码器在不同场景下的表现。 测试...
1. 单元测试(Unit Testing):这是最基本的测试层次,主要验证代码中的最小可测试单元,如函数或方法,确保它们按预期工作。Python 中的`unittest`模块提供了一套完整的单元测试框架,允许开发者编写断言来检查程序...
- **测试工程管理**:提供层次化的管理结构,如测试工程->测试集->测试用例,便于对测试过程进行全面管理。 - **源码自动分析**:支持C语言源码的静态分析,包括函数调用关系图的可视化展示,以及各种源码信息的...
1. **测试工程管理**:采用层次化的管理结构,包括测试工程、测试集和测试用例等不同层级。所有信息统一存储在数据库中,便于管理和统计。 2. **源码自动分析**: - 支持C语言源码分析。 - 提供函数静态调用关系...
### SAP BW 自定义层次结构提取架构 #### 概述 本文档主要介绍了如何从SAP R/3系统中提取自定义层次结构至SAP BW系统的架构设计。此文档由IBM印度公司的Nilesh Ramesh Ahir撰写,他拥有丰富的SAP经验,包括ABAP、...
1. **软件测试基础**:软件测试是软件开发过程中的一个关键阶段,它通过执行软件来查找并识别出程序中的错误、缺陷和漏洞。这通常涉及到需求分析、测试计划、用例设计、执行测试、报告问题以及缺陷跟踪等步骤。 2. ...
层次分析法是一种多准则决策方法,通过建立层次结构模型,把复杂的决策问题分解为多个组成因素,并对这些因素进行定量和定性分析,最终计算出各因素(告警)的权重。这样可以区分哪些告警是关键的,哪些是次要的,...
每个文件作为一个单元,针对其中的每个函数的每个参数进行深度解析,对于嵌套类型,复杂类型等都可以实现精确的解析和分解,将复杂类型逐层讲解为基础数据类型,并产生参数结构的描述文件(PSD)。 (2) 函数驱动...
2. **Couple**:这个图像通常包含两个人的肖像,用于测试人脸检测、人脸识别和色彩处理等技术。 3. **Pepper**:通常指的是“椒盐噪声”图像,这种图像含有大量的黑白点,模拟了图像传感器常见的噪声类型,常用于...
常见的模式有`RETR_LIST`(不建立层次结构)、`RETR_EXTERNAL`(只提取最外层轮廓)、`RETR_TREE`(提取所有轮廓并建立完整的层次结构)和`RETR_CCOMP`(提取所有轮廓并分组为两个层次,内部和外部)。 - `method`:...
基于层次结构CPN的OpenFlow交互属性测试是一篇研究论文,主要研究了如何利用形式化方法,特别是通过颜色Petri网(CPN)来分析和测试OpenFlow协议的交互属性。OpenFlow是一种新兴的网络协议,它为研究人员提供了灵活...
Iris数据集是一个经典的多类分类问题,包含不同种类鸢尾花的特征数据,如花瓣长度、花瓣宽度等。通过对比标准的PSO算法,层次化粒子群优化算法在提取分类规则时,能够提升规则的精度,即分类的准确性。 【文献比较...
在上述数据中,我们看到了JSON如何被用来表示复杂的层次结构,如数组和对象的嵌套。 #### 示例解析: - **agenda**:这部分包含了三个项目,每个项目都有一个标题,如“Concentració de carròssers i Ruada de ...
7. **Airplane24.bmp**:可能是一个包含复杂结构和层次感的图像,适合测试图像分割和目标检测算法。它能检验算法在复杂背景下提取目标的能力。 8. **Sailboat24.bmp**:这个图像可能具有水面反射和波纹效果,可用于...