您的位置:首页>软件开发>软件工程>软件方法学>

在面向对象框架设计中重用内建自测试

[ 来源:UML软件工程组织 | 更新日期:2007-7-15 20:17:06 | 评论 0 条 | 我要投稿 ]
面向对象框架将软件的复用级别从代码模型扩展到了体系结构和域信息层次。本文更进一步地将这种扩展延伸至内建自测试(built-in tests 简称:BITs)的面向对象框架开发中来。在对象和面向对象框架中嵌入BITs的方法将被着重介绍。本文还仔细分析了在常态模式和测试模式中带有BITs的对象和框架的行为,并系统地提供了在面向对象框架开发可重用BITs的方法。在本文所述的这种开发模式最引人注意的还是面向对象框架中的BITs能够象普通面向对象的代码一样被继承和重用。因此我们可以通过BIT方法来提高自测试面向对象框架的可测试性和可维护性。BIT方法可以用于面向对象框架的分析、设计、编程等阶段。

 关键词 字串3

 软件工程,面向对象技术,框架,模式,代码重用,框架重用,测试重用,内建测试,可测试软件

字串2

 1. 介绍 字串8

 面向对象框架的设计方法在[1-4]中已经被多次讨论。面向对象软件测试的特征和方法在[5-10]得以极大地扩展。本文所要阐述的是在面向对象框架开发中使用BIT方法和重用BITs。 字串5

 普通的软件测试常常是基于应用规范,因而较难重用,商用化的模块或包尤为甚。即使是在一个软件开发组织中,由于程序设计和测试分布于不同的部门并用不同的文档来进行描述。这使测试重用变得十分困难[5,11,12]。 字串7

 在[5,13-15]中BIT的概念曾得以介绍,而且在面向对象中运用可继承和可重用的测试方法的思路在[16,15]中亦被提及。本文将更进一步地提出一实用的途径,该途径结合了BIT方法和重用技术。通过该途径,在面向对象框架开发中应用中可复用BITs能够系统地被拓展。

字串6

 2. 面向对象框架中的内建测试 字串9

 BITs是一种新型的软件测试途径。 BITs在软件中以源代码(成员函数,方法)的形式出现。BITs在常态模式下是独立的并在测试模式下被激活。面向对象框架将软件的可复用度从代码模型扩展到了体系结构和域信息方面。可复用的BITs方法更进一步地延展了这种软件的可重用性。 字串7

 BIT是一种设计可测试软件新思维。传统的面向对象测试着眼于为已经存在的对象和框架编写测试代码,生成测试用例。可测试的面向对象框架则着眼于为对象和框架建立可测试性。BIT技术最引人入胜的特色在于测试能够被继承和重用。BIT方法可以用于面向对象框架的分析、设计、编程。

字串4

 2.1 对象级别的BITs 字串8

 通过在传统的对象结构[18]中嵌入测试声明和测试用例。生成的BIT对象的原型如标记A所示 字串3

Class class-name {
// interface
Data declaration;
Constructor declaration;
Destructor declaration;
Function declarations;
Tests declaration; // Built-in test declarations
// implementation
Constructor;
Destructor;
Functions;
TestCases; // Built-in test cases as new
// member functions (methods)
} TestableObject;

 标记A BIT对象

字串5

 BITs方法作为BIT对象的组成成分。BITs与普通对象中标准的构造函数和析构函数一样有着相同的语法形式,因此 BITs如同类的方法(成员函数)一样能够被继承和重用。BITs能够融入对象和模型对象框架中并能轻易的实现为C++,JAVA等语言。

字串8

 BIT对象如同普通对象一样在常态模式下可以调用正常的方法(函数),在测试模式中BITs被调用。其调用形式如下所示: 字串4

TestableObject :: TestCase1;
TestableObject :: TestCase2;
......
TestableObject :: TestCaseN;

 因而,BIT对象能够自动地被测试并报告响应结果。

字串9

 2.2 框架级别的BITs

字串3

 事实已经证明:如果每一个对象都能够被测试,那么包容这些对象的系统也能够被自底向上地被测试。因而这种方法同样能够扩展到面向对象框架级别。一个面向对象的框架具有一个BIT子系统和众多BIT类。图-1是一个带有BIT子系统和BIT类的框架。模块1,3 和 2 分别为可测试、部分可测试和应用规范子系统的BIT类集合。子系统4是一个全局的子系统,通过预设的事件驱动线程和场景对整个系统进行测试。BIT类和子系统可能会给类间的测试增加额外的耦合。通过限定测试模式中耦合的激活数,采用BIT将不会增加面向对象框架的复杂性。

 
 
                     图-1 BIT面向对象框架 字串3

 值得一提的是,对于一个基于最终用户的BIT框架来说,已经存在FRFs、PRFs(部分)和全局BIT子系统的BITs。因此一旦有新的BITs加入,我们需要将它与原有的BITs进行整合。通过这个途径,一个理想的、可测试的、测试继承的和可复用的面向对象框架将得以实现。由于BITs面向对象框架内建测试机制,因此维护人员和终端用户无须在测试和维护阶段重新分析代码,设计测试用例和使用这些用例进行测试。 字串7

 3. BITs面向对象框架的重用

字串7

 3.1对象级别的BITs复用 字串2

 BIT对象的方法(函数)按常态模式和测试模式进行分类。前者对应的方法(函数)实现的是代码的可复用而后者实现的是测试重用。

字串3

 在常态模式下,BIT对象拥有同普通对象相同的方法(成员函数)。对象的静态和动态行为也与普通的对象毫无差异。它们以ObjectName::FunctionName; 的方式被调用。BITs对对象的效率不造成任何影响。

字串2

 在测试模式下,内建的BITs通过调用测试用例被激活,其激活方式为ObjectName::TestCaseI。每个TestCaseI由一个BIT驱动器(BIT Driver)和测试用例构成。测试结果能够自动地被BIT驱动器报告。
  
     字串6

            图-2 BIT对象结构

字串1

 3.2 面向对象框架级别的BITs复用

字串8

 与BIT对象相似,一个带有可复用BITs的面向对象框架亦拥有常态模式和测试模式之分。该框架能够实现代码重用和测试重用。

字串1

 在常态模式下,一个BIT面向对象框架与普通的面向对象框架在功能上并无差别。它的静态和动态行为也与普通的面向对象框架无差异。BIT框架内TRF,PRF和ASF功能能够以ObjectName::FunctionName; 的形式进行调用。BIT类和子系统不影响面向对象框架的运行效率。

字串3

 BIT面向对象框架内建测试机制,因此以及面向终端用户的BIT对象框架能够在测试模式中被调用和重用。框架的使用者还可以在该系统中添加BITs声明和类。

   字串8

               图-3 BIT框架结构

字串4

 4 BITs重用研究案例 字串1

 一个二分查找的 BIT对象的如标记B所示, 该BIT对象分为两部分:一般的方法(成员函数)和 BIT方法(函数)。该BIT对象中通过内建一个测试用例来说明BIT s方法。

字串1

 在常态模式下,标记B中普通的方法被调用:BITsBinarySearch::BinarySearch(int Key, int DataSet[10])。
在测试模式下,内嵌的BIT成分通过调用 BITsBinarySearch::BIT1()被重用.

字串5

Class BITsBinarySearch {
/////////////////////////////////////////////////////////////////////////////
// Interface
/////////////////////////////////////////////////////////////////////////////
// Member functions
BITsBinarySearch(); // The constructor
~BITsBinarySearch(); // The destructor
int BinarySearch (int Key; int DataSet[10]); // The conventional object
void BIT1(); // The built-in-tests 1...3
///////////////////////////////////////////////////////////////////////////
// Implementation
///////////////////////////////////////////////////////////////////////////
// ================================
// Part 1: The conventional function code
// ================================ 字串6
int BinarySearch (int Key, int DataSet[10])
{
// The conventional object
// Assume: DataSet is ordered
// LastElement -FirstElement >=0
// and FirstElement >=0
// Input: Key to be found in the DataSet
// Output: TestElemIndex
Private:
int bott, top, i;
int found;
found = false;
Bott = 1;
Top = ArraySize (DataSet); // The last element in DataSet
while (bott <_ top="top" _="_" not="not" foundbr="foundbr" />{
i = floor ((bott + top)/2));
if DataSet[i] == Key
Found = true;
else if DataSet[i] <Key
Bott = i +1
else Top = i +1;
}
if found == true
return i; // The index of the element 字串3
else return 0; // An indicator of not existence
}
// ==================================
// Part 2: The BITs
// ==================================
// BIT case 1
// ---------------------------------------------------------
void BIT1()
{
// BIT case 1: Array size of 1, key in array
private:
int DataSet[1] = {16};
int Key = 16;
int StdElemIndex = 1;
int TestElemIndex;
char TestResult1[5];
// Test implementation
TestElemIndex = BinarySearch (Key, DataSet);
// Test analysis
cout <_ stdelemindex1=" << StdElemIndex << " nbr="nbr" />cout <_ testelemindex1=" << TestElemIndex << " nbr="nbr" />if TestElemIndex == StdElemIndex
TestResult1 = "OK"; 字串3
else TestResult1 = "FALSE";
cout <_ xmlns:testresult1="urn:x-prefix:testresult1" testresult1:_="testresult1:_" _="_" testresult1="testresult1" nbr="nbr" />}
} 字串2

标记B 二分查找BIT对象

字串8

  在维护中应用BIT成分的途径如标记C所示。一个新对象-DatabaseQuery被开发出来,在BITsBinarySearch中的BIT成分能够如同普通方法(成员函数)一样被继承和重用。此外,新加入的BITs也能够被添加到如标记C所示的新对象中。 字串7

Class DatabaseQuery: public BITsBinarySearch
{
//////////////////////////////////////////////////////////////////////////////
// Part 1: The inherited conventional functions
//////////////////////////////////////////////////////////////////////////////
int DatabaseQueryBinarySearch (int Key, int DataSet[10]) :
BITsBinarySearch::BinarySearch(int Key; int DataSet[10]);
//////////////////////////////////////////////////////////////////////////////
// Part 2: The inherited BIT functions
//////////////////////////////////////////////////////////////////////////////
void BIT1() : BITsBinarySearch::BIT1();
//////////////////////////////////////////////////////////////////////////////
// Part 3: The newly developed BITs
//////////////////////////////////////////////////////////////////////////////

字串4


// BIT case 2
// ---------------------------------------------------------------
void BIT2()
{
// BIT case 2: Even array size, key 1st element in array
Private:
int DataSet [6] = {16,18,21,23,29,33};
int Key = 16;
int StdElemIndex = 1;
int TestElemIndex;
char TestResult2 [5];
// Test implementation
TestElemIndex = BinarySearch (Key, DataSet);
// Test analysis
cout <_ stdelemindex2=" << StdElemIndex << " nbr="nbr" />cout <_ testelemindex2=" << TestElemIndex << " nbr="nbr" />if TestElemIndex == StdElemIndex
TestResult4 = "OK";
else TestResult2 = "FALSE";
cout <_ xmlns:testresult2="urn:x-prefix:testresult2" testresult2:_="testresult2:_" _="_" testresult2="testresult2" nbr="nbr" />} 字串6

 标记C DatabaseQuery对象

字串7

 新BIT对象 DatabaseQuery中,源至BITsBinarySearch 对象的BITs方法依然通过DatabaseQuery::BIT1()(等同于BITsBinarySearch::BIT1)被激活。DatabaseQuery中新的BITs方法以同样的方式DatabaseQuery::BIT2()得到激活。 字串6

 5 结论

字串3

 本文提出了一种融合可复用内建测试(BITs)的面向对象框架设计方法。并分析了面向对象框架中BITs的重用途径。BIT方法大大扩展了面向对象框架从代码到测试的可重用性。因此高度可测试和测试可复用的面向对象框架能够在现有的基于普通的面向对象框架上被开发出来。 字串8

 BIT方法是普通面向对象框架技术的补充和延展。BIT方法在面向对象的分析、设计、编码中得到了广泛的应用。BIT方法能够融合任何利用黑盒方法和/或白盒方法产生的测试用例并以面向对象框架组件方式存在。

字串8

 特别说明

字串5

 注:本文的原名为On Built-in Test Reuse in Object-Oriented Framework Design,由Yingxu Wang等著,由中国系统分析员顾问团高级顾问张华先生翻译。本文作者在本文的写作中得到了European Software Institute和IVF Centre for Software Engineering两个机构的支持,我们在此还要感谢他们对此提出有价值的评论。

字串7


Tags:
责任编辑:
您的评论
用户名: 新注册) 密码: 匿名评论 [所有评论]

·用户发表意见仅代表其个人意见,并且承担一切因发表内容引起的纠纷和责任
·本站管理人员有权在不通知用户的情况下删除不符合规定的评论信息或留做证据
·请客观的评价您所看到的资讯,提倡就事论事,杜绝漫骂和人身攻击等不文明行为