第26卷第5期
V0J.26 No.5
企 业 技 术 开 发
TECHNOLOGJCAL DEVELOPMENT OF ENTERPRISE
2007年 5月
Mav.2007
测试驱动开发应用研究
唐金鹏。李玲琳
(湖南省交通职业技术学院 信息管理系,湖南 长沙 410004)
摘 要:测试驱动开发是极限编程的重要 实践之一,文章提出了TDD的实施步骤,介绍了当前常用的测试框架,
并以一个实际项目为例,详细介绍了测试驱动开发在NU l中的应用。
关键词:测试驱动开发;极限编程;测试框架;NUnit
中图分类号:TP31】 文献标识码:A 文章编号 1006—8937(2007)05—0018—04
Applieati~ eareh on test driven develo[ ~entAOOlication research On test driven develooment
TANG Jin-peng,LI Ling-lin
(Department of Information Management,Hunan Communication Polytechnic,Changsha,Hunan 410004,China)
Abstract:The test’driven development is one of the important practice of the extreme programming,this
paper puts forward the TDD implementation step first,then introduces the current test framework.At last,
taking an actual project as an example,it describes in detai the TDD’S application on NUnit.
Keywords:test driyen development;extreme programming;test framework;NUnit
极限编程【ll(eXtreme Programming)是 Kent Beck
倡导的一种新型软件开发方法,它是一个周密而严
谨的软件开发流程。它基于简单、交流、反馈、勇气
的原则,在充分考虑到人的因素的前提下进行,达到
客户的最大满意度。
XP旨在采用许多只能通过沟通完成的实践来
保持良好的沟通,如单元测试、结对编程及任务估
算。XP要求今天能实现今天的设计即可,不去预先
考虑解决明天或后天的事情,XP强调即时的反馈。
它有两种反馈模式:以分钟和天的级别进行反馈;
以周和月的级别进行反馈。程序员为系统中所有可
能出错的逻辑编写单元测试,他们每分钟都得到有
关系统状态的具体反馈。客户隔两到三周检查一次
进程,查看开发团队的整体速度是否与计划相符,
并随之调整计划。XP要求程序员有勇气即时地修
复缺陷,即使这使原来运行通过的测试中出现了错
误;如果一天快要结束,而代码依然失控,XP要求
程序员有勇气放弃原来的代码。总之,极限编程要
求程序员快速反馈,把每个问题都看成可以用简单
设计来解决 ,递增进行微小更改来解决问题。测试
驱动开发(Test Driven Devel0pment,TDD)作为XP
编程思想的一种主要实践/21,可以有效地让程序开
发人员开发出更高品质的、经过完整测试的程序。
收稿日期:2007—01—25
作者简介:唐金鹏fl975一),男,湖南长沙人 ,硕士研究生,讲师
主要研究方向:工作流管理、网络教育技术。
1 测试驱动开发
1.1 测试驱动开发的步骤
测试驱动开发过程如下:
①写出能表明类的功能的测试。、
②运行测试 。编译失败,因为被调用的函数还
没有写。
③写一个简单的类,使所写的测试可编译即可。
④编译通过,但测试失败。
⑤写程序的主体,使测试可以通过。
⑥运行测试,测试通过。
⑦从耦合性、内聚度 、冗余和简洁几方面来重
构代码。
⑧测试再次通过。
⑨回到①,直到关于系统的所有功能测试都写
完。
1.2 测试框架
测试框架是测试驱动开发的关键,尤其是在需
要用大量测试来实现需求的情况下。如果完全靠手
工来执行测试,那么它会变成一个花费大量时间而
且单凋无味的工作。测试框架能够使测试和开发环
境相融合,指导测试程序,收集并显示相关信息,使
单元测试融合到一个更大的测试框架里面以便更
容易地增加、管理、执行测试,以及分析测试结果。
在过去的几年中,在许多开发环境下都产生了相应
的单元i贝0试框架,如基于 Java的测试框架 Junit、基
维普资讯
第 26 卷第 5 期
企业技术开发
TECHNOLOGICAL DEVELOPMENT OF ENTERPRISE
2∞7 年 5 月
叫试J驱动开友雇用研究
唐金鹏,李玲琳
(湖南省交通职业技术学院信息管理系,湖南长沙 410004)
摘 要:测试驱动开发是极限编程的重要实践之一,文章提出了 TDD 的实施步骤,介绍了当前常用的测试框架,
并以一个实际项目为例,详细介绍了测试驱动开发在 NUnil 中的应用。
关键词:测试驱动开发;极限编程;测试框架 NUnit
中图分类号: TP311 文献标识码:A 文章编号; 1∞16-8937 (2(){)7) 05-∞18-04
Application research on test driven development
TANG Jin-peng ,LI Ling-lin
(Department of Information Management, Hunan Communication Polytechnic, Changsha, Hunan 410004 ,Chìna)
Abstract:The test' driven development is one of the important practice of the extreme programming, this
paper puts forward the TDD implementation step first, then introduc臼 the current test framework. At last,
taking an actual project as an example, it describes in detai the TDD' S application on NU nit.
Keywords: test driven development; extreme programming; test framework; NU nit
极限编程[ll( eXtreme Programming)是 Kent Beck
倡导的-种新型软件开发方法,它是一个周密而严
谨的软件开发流程。它基于简单、交流、反馈、勇气
的原则,在充分考虑到人的因素的前提下进行,达到
客户的最大满意度。
XP 旨在采用许多只能通过沟通完成的实践来
保持良好的沟通,如单元测试、结对编程及任务估
算。XP 要求今天能实现今天的设计即可,不去预先
考虑解决明天或后天的事情,XP 强调即时的反馈。
它有两种反馈模式:以分钟和天的级别进行反馈;
以周和月的级别进行反馈。程序员为系统中所有可
能出错的逻辑编写单元测试,他们每分钟都得到有
关系统状态的具体反馈。客户隔两到三周检查一次
进程,查看开发团队的整体速度是否与计划相符,
并随之调整计划。XP 要求程序员有勇气即时地修
复缺陷,即使这使原来运行通过的测试中出现了错
误才日果一天快要结束,而代码依然失控,XP 要求
程序员有勇气放弃原来的代码。总之,极限编程要
求程序员快速反馈,把每个问题都看成可以用简单
设计来解决,递增进行微小更改来解决问题。测试
驱动开发(Test Driven Development , TDD )作为 XP
编程思想的一种主要实践l21,可以有效地让程序开
发人员开发出更高品质的、经过完整测试的程序。
收稿日期: 2007-01-25
作者简介2 唐金鹏(1975一),男,湖南长沙人,硕士研究生,讲师,
主要研究方向:工作流管理、网络教育技术.
1 测试驱动开发
测试驱动开发的步骤
测试驱动开发过程如下:
①写出能表明类的功能的测试。飞
②运行测试。编译失败,因为被调用的函数还
没有写。
③写一个简单的类,使所写的测试可编译即可。
④编译通过,但测试失败。
⑤写程序的主体,使测试可以通过。
⑥运行测试,测试通过。
⑦从搞合性、内聚度、冗余和简洁几方面来重
构代码。
,兰2
7已。
⑧测试再次通过。
⑨回到①,直到关于系统的所有功能测试都写
测试框架
测试框架是测试驱动开发的关键,尤其是在需
要用大量测试来实现需求的情况下。如果完全靠手
工来执行测试,那么它会变成一个花费大量时间而
且单调无昧的工作。测试框架能够使测试和开发环
境相融合,指导测试程序,收集并显示相关信息,使
单元测试融合到一个更大的测试框架里面以便更
容易地增加、管理、执行测试,以及分析测试结果。
在过去的几年中,在许多开发环境下都产生了相应
的单元测试框架,如基于 Java 的测试框架 Junit 、基
第26卷第5期 唐金鹏,等:测试驱动开发应用研究 l9
于 Delphi的 Dunit、基于 C++的 CppUnit,其中有一
个很出色的适用于.Net Framework环境的工具,即
NUnit[31。NUnit引进了一个新的程序开发的概念——
属性(Attributes),使我们可以在代码之上再加入元
数据(metadata)。一般来说,属性不会影响到主要代
码的执行,其功能是在代码之上添加了信息。在
NUnit里测试运行器(Test Runner Application),会
扫描我们编译好的代码,并且从属性里知道测试类 ,
了解需要执行的测试方法,然后,测试运行器使用.
Net的 Renection技术来执行这些测试方法。
我们需要做的事情,就是使用正确的属性来描
述我们的测试类和测试方法。
NUnit提供了许多不同的属性,使我们可以自
由地写我们想要的单元测试。这些属性可以用来定
义测试固定成员(testfixtures)、i贝4试方法(testmeth—
ods)以及 setup及 teardown方法(准备和善后工作
的方法)。
除此之外,还要求其它属性可以来设定预期发
生的异常(exceptions),或者要求测试执行器(Test
Runner)跳过某些测试方法不执行。
NUnit的属性包括:
~TestFixture属性。TestFixture属性用在类上 ,
其作用是标志该类含有需要执行的测试方法。使用
TextFixture属性的类需要符合一项惟一附加的限
制,就是需要有一个公共的缺省构造函数。
~Test属性。Test属性主要用来标示在 TextFix—
ture中的测试方法,表示这个方法需要被 Test Run—
ner aDplicati0n所执行。有 Test属性的方法必须是
public的,而且必须无返回值也没有任何传人的差
数。
③SetUp&Teardown属性。有 SetuD属性的方法
会在该 TextFixture中的每一个测试方法被执行之
前先被 Test Runner所执行,而有 Teardown属性的
方法则在每一个测试方法被执行之后被执行。所
以,Setup属性和Teardown属性被用来做些准备或
善后的工作,例如数据库连接与断开等。
④ExpectedException属 性 。ExpectedException
属性用来标示某个方法是否应该产生异常,并且是
可使用typeof来判断异常的类型。如果是预期的异
常,则测试顺利通过。如果预期产生多个异常的话,
可以使用多个 ExpectedException属性。但是 ,一个
测试方法应该只测试一个功能,所以应该避免使用
多个 ExpectedException属性。这个 ExpectedExcep—
tion属性不具有继承功能,所期望的异常的子类不
能通过验证。
(~)Ignore属性。该属性用于标示某个测试方法,
使 Test Runner在执行的时候,略过该方法不执行。
它保留测试方法,在 TestRunner的执行结果里面,
也会提醒这个被略过的测试方法的存在。
⑥NUnit Assertion类。NUnit除了以上所提到
的这些用来标示测试程序的属性之外 ,还有一个重
要的类——Assenion。Assertion类提供了一系列的
静态方法,用来验证程序产生的结果和所预期的是
否一致。
1.3 TDD在项目中的具体应用
我们开发的网上作业系统采用了MVC架构模
式f4J。在这种情况下,要确保用户界面接口是松耦合
度,与内部执行的逻辑完全区分开来。具体实践中,
界面类只负责显示界面工作,简单地使用存取信息
的getting/seting方法。当用户做了一些动作时(例
如按了一个按钮),界面类里的event handler的责
任就是把这个动作交给业务逻辑的控制类来处理。
这样界面类的任务就简单明了,并且不易出错,我们
就把测试的重点放在业务逻辑层的控制类上。
由于控制类要存取用户界面里的信息,而用户
界面是不方便加入我们的单元测试进行测试的。因
此,我们可以利用模拟对象,它与用户界面拥有相
同的接口,在测试中可以完成替代用户界面类。我们
使用代码自顶向下的开发原则,遵循测试驱动开
发,由单元测试生成模拟类,用来代替用户界面协
助开发控制类,然后再从模拟类提取出接口生成一
个接口类,最后开发用户界面类,使它继承这个接
口,开发出与接口一致的用户界面。下面我们按照
测试驱动的开发顺序来开发用于接受用户输入用
户名和密码的界面类和从数据源提取数据来判断
用户名和密码是否正确的控制类。
①设定一个测试用例,编写单元测试 ,如下:
[Test]
public void TestI~ginSuccessful()
{
Assertion.Assert fcontroller.Login fview.Name,view.
Pwd)==userld1;//用户名和密码正确
}
[Test]
public void Testl~ginBadName0
{
Assertion.Assert(controller.1~gin(⋯ ’,view.Pwd)==0);
Assertion.Assert rview.ErrorMessage== ”Bad Us—
维普资讯
第 26 卷第 5 期 唐金鹏,等2 测试驱动开发应用研究 19
于 Delphi 的 Dur山、基于 C朴的 CppUnit ,其中有一
个很出色的适用于.Net Framework 环境的工具,即
NUnit[3JoNUnit 引进了一个新的程序开发的概念一一
属性(Attrihutes) ,使我们可以在代码之上再加人元
数据(metadata)。一般来说,属性不会影响到主要代
码的执行,其功能是在代码之上添加了信息。在
NUnit 里测试运行器(Test Runner Application) ,会
扫描我们编译好的代码,并且从属性里知道测试类,
了解需要执行的测试方法,然后,测试运行器使用
Net 的 Reflection 技术来执行这些测试方法。
我们需要做的事情,就是使用正确的属性来描
述我们的测试类和测试方法。
NUnÌt提供了许多不同的属性,使我们可以自
由地写我们想要的单元测试。这些属性可以用来定
义测试固定成员( testfixtures )、测试方法( testrr削h
ods) 以及 setup 及 teardown 方法(准备和善后工作
的方法)。
除此之外,还要求其它属性可以来设定预期发
生的异常 (exceptions) ,或者要求测试执行器(Test
Runner)跳过某些测试方法不执行。
NUnit 的属'性包括:
①TestFixture 属'性。TestFixture 属性用在类上,
其作用是标志该类含有需要执行的测试方法。使用
TextFixture 属性的类需要符合一项惟一附加的限
制,就是需要有一个公共的缺省构造函数。
②Test 属J性。Test 属性主要用来标示在 TextFix
ture 中的测试方法,表示这个方法需要被 Test Run-
ner application 所执行。有 Test 属性的方法必须是
puhlic 的,而且必须无返回值也没有任何传人的差
数。
( Set U p&Teardown 属性。有 Setup 属性的方法
会在该 TextFixture 中的每一个测试方法被执行之
前先被 Test Runner 所执行,而有 Teardown 属性的
方法则在每一个测试方法被执行之后被执行。所
以, Setup 属性和 Teardown 属性被用来做些准备或
善后的工作,例如数据库连接与断开等。
④ ExpectedException 属性。ExpectedException
属性用来标示某个方法是否应该产生异常,并且是
可使用 typeof来判断异常的类型。如果是预期的异
常,则测试顺利通过。如果预期产生多个异常的话,
可以使用多个 ExpectedException 属性。但是,一个
测试方法应该只测试一个功能,所以应该避免使用
多个 ExpectedException 属性。这个 ExpectedExcep
tion 属性不具有继承功能,所期望的异常的子类不
能通过验证。
⑤Ignore 属性。该属性用于标示某个测试方法,
使 Test Runner 在执行的时候,略过该方法不执行。
它保留测试方法,在 TestRunner 的执行结果里面,
也会提醒这个被略过的测试方法的存在。
( NUnÌt Assertion 类。NUnit 除了以上所提到
的这些用来标示测试程序的属性之外,还有一个重
要的类一-Assenion 0 Assertion 类提供了一系列的
静态方法,用来验证程序产生的结果和所预期的是
否一致。
TDD 在项目中的具体应用
我们开发的网上作业系统采用了 MVC 架构模
式[付。在这种情况下,要确保用户界面接口是松搞合
度,与内部执行的逻辑完全区分开来。具体实践中,
界面类只负责显示界面工作,简单地使用存取信息
的 getting/seting 方法。当用户做了一些动作时(例
如按了一个按钮),界面类里的 event handler 的责
任就是把这个动作交给业务逻辑的控制类来处理。
这样界面类的任务就简单明了,并且不易出错,我们
就把测试的重点放在业务逻辑层的控制类上。
由于控制类要存取用户界面里的信息,而用户
界面是不方便加入我们的单元测试进行测试的。因
此,我们可以利用模拟对象,它与用户界面拥有相
同的接口,在测试中可以完成替代用户界面类。我们
使用代码自顶向下的开发原则,遵循测试驱动开
发,由单元测试生成模拟类,用来代替用户界面协
助开发控制类,然后再从模拟类提取出接口生成一
个接口类,最后开发用户界面类,使它继承这个接
口,开发出与接口一致的用户界面。下面我们按照
测试驱动的开发顺序来开发用于接受用户输入用
户名和密码的界面类和从数据源提取数据来判断
用户名和密码是否正确的控制类。
①设定一个测试用例,编写单元测试,如下:
[Test]
puhlic void TestLoginSuccessfulO
( ( , view.
Pwd)==userld) ; / /用户名和密码正确
[Test]
puhlic void TestLoginBadNameO
( controller .Login(" ", view .Pwd)==O) ;
( == "Bad Us-
20 企 业 技 术 开 发 2007年5月
e卜Name”1//界面返回错误信息
)
[Test]
public void TestLoginBadPwd(')
{
//输入的密码不正确,界面返回错误信息
)
②编译 ,发现不能编译 ,因为还没有生成相应
的两个类。以通过编译为标准生成这两个类。
③编译通过,但测试失败,因为 Name和 Pwd的
值与期望不符,Name与Pwd还没有开始赋值。修改
类LogMockView,使它具备可以设置和获取的Name、
Pwd和ErrorMessage3个属性。修改类 LogController,
使它可以从数据源读取数据并与界面类的数据比
较:
public class Lo gController
{
public int Login(string username,string password)
{
DataSet ds=new DataSet0;
String userFile=@”F:~NETsource\users.xml”;//读数
据源
FileStream f~--new FileStream(userFile.FileMode.Open,
FileAccess.Read);
StreamReader reader=new StreamReader(fs'l;
ds.ReadXml(reader);
fs.CloseC);
ds.Tables[O].PrimaryKey=new DataColumn{ds.Tables
[01.Columns[“username”】}:
DataRow dr=ds.Tables【0].Rows.Find(usemame);///~
询用户名
If(dr==nul1)//“无此用户”
{
_
view.ErrorMessage=’’Bad UserName”:
return 0;
)
if(dr【‘‘password”].T0string()===passw0rd)/登录成功
{
return Int32.Parse(dr{“user_id”]:ToString(1;
)
e,lse//“密码错误”
{
一
view.ErrorMessage=’’Bad Password”;
return 0:
J
)
④运行测试,测试通过。
⑤将模拟类 LogMockView所需要执行的接口
提炼出来:
public interface ILo gView
{
string Name{get;set;)
string Pwd{get;set;)
string ErrorMessage fget;set;)
)
有了这个接口类,我们把在控制类里面用到
LogMockView的代码,改成使用 ILogView,然后就
可以修改LogMockView,使它执行这个 ILogView。
重构代码以后。再执行一下单元测试,确保代码的
正确性。
⑥生成界面。如果所有测试都通过了,就可以
很容易地写一个 Windows Form 的用户界面类,此
类执行接口类 IlogView。下面我们用ASP.NET来写
界面。
<tr>
<td>NaBe:</td>
<td ><asp:Textbox runat= ”server” id = ”name—
Te :tbox’ d>
</tr>
<tr>
<td>Pwd:</td>
<td><asp:Textbox runat="server" id=”pwdTextbox,
><td>
</tr>
<tr>
<td>ErrorMessage :</bd>
<td><asp:Textbox IMnat=”server” id="errorm essage—
Texbox’ cad> 。
·: r>
用 C撑写的绑定代码:
public class Lo gView :System.Web.UI.Page,ILo gin—
View ’
{
private void Page
_ Load(Object sender,System.Even—
tArgs e)
f
controller=new LogController(this);
)
维普资讯
20 企业技术开发 2∞7 年 5 月
er-Name")11界面返回错误信息
[Test]
public void TestLogin8adPwd()
//输入的密码不正确,界面返回错误信息
②编译,发现不能编译,因为还没有生成相应
的两个类,以通过编译为标准生成这两个类。
③编译通过,但测试失败,因为 Name 和Pwd 的
值与期望不符, Name 与Pwd 还没有开始赋值。修改
类LogMockView,使它具备可以设置和获取的 Name 、
Pwd 和 ErrorMessage3 个属性。修改类LogController ,
使它可以从数据源读取数据并与界面类的数据比
较:
public class 1ρgController
public int 1ρgin(string username , string password)
DataSet ds=new DataSetO;
String userFile =@"F: \NETsource\";//读数
据源
FileStream fs=项ew FileStream( userFile,,
) ;
StreamReader reader=new StreamReader(fs);
也.ReadXml(reader) ;
fs. Close();
[O].PrimaryKey=new DataColumn{
[O].Columns["username"]} :
DataRow dr=ds. Tables [0]. Rows. Find( usemame); / t碴
询用户名
H( dr==null)/ /"无此用户"
="8ad UserName":
return 0;
if( dr[" password "]. ToString()===password)/登录成功
return (dr["user_ id'']:ToString();
else 11"密码错误"
="8ad Password";
return 0;
④运行测试,测试通过。
⑤将模拟类LogMockView 所需要执行的接口
提炼出来:
public interface IlρgView
string Name{get; set;}
string Pwd {get ; set ; }
string ErrorMessage {get; set ; }
有了这个接口类,我们把在控制类里面用到
LogMock View 的代码,改成使用 lLogView,然后就
可以修改LogMockView,使它执行这个 lLogViewo
重构代码以后,再执行一下单元测试,确保代码的
正确性。
⑥生成界面。如果所有测试都通过了,就可以
很容易地写一个 Windows Form 的用户界面类,此
类执行接口类IlogView。下面我们用 来写
界面。
<tr>
<td> N ame : </td>
<td ><asp: Textbox
Textbox "/><1d>
G吃r>
<tr>
<td> Pwd : <1d>
runat = server id = "name-
<td><asp: Textbox runat=" server" id=" pwdTextbox ,
><td>
G吃r>
<tr>
<td> ErrorMessage : <1d>
<td><asp: Textbox runat=" server" id=" errormessage-
Texbox "/><1d>
ψtr>
用 C# 写的绑定代码:
public class LogView : ,Ilρgin
View
private void Page_Load (object sender,-
tArgs e)
controller=new LogController( this) ;
第26卷第5期 唐金鹏,等:测试驱动开发应用研究 21
public string Name
{
get{return nameTextbox.Text;}
set{nameTextbox.Text=value;}
}
public string Pwd
{
get{return pwdTextbox.Text;}
set{pwdTextbox.Text=value;}
J
public string ErrorMessage
{
get{retu~ errormessageTextbox.Text;}
set{errormessageTextbox.Text=value;}
}
2 结 论
(上接第 14页) (CPropertySheet)~l若干个属性
页类(CPropertyPage)。
结果输出模块调用 Excel程序,把计算结果用
Excel的形式表示出来,清晰易查。
身份验证模块用于管理用户名和密码,实现添
加、删除用户,验证密码,修改密码等功能。
4 优化结果
采用改进遗传算法优化后结果见表 1。
表 1优化设计结果
目前测试驱动开发得到了越来越多人的关注。
本文说明了如何实施测试驱动。当然,测试驱动开
发有许多难点,例如如何测试数据库和分布式系统。
测试驱动开发在本项目中作为一个尝试,占整个开
发的一小部分,虽然适应它需要一段时间,但它对
我们整个项目产生了很重要的影响,提高了代码的
质量,帮助我们设计了具有可测试性的代码。
参考文献:
【1】Kent Beck.测试驱动开发【I .北京:中国电力出版社,2003.
【2】 Kent Beck.Extreme programming explained:Embrace
change[J1.Addison--Wesley,1999.,(4).
【3】Nunit.Nunit Release 2.2.9【DB/OL].http:『/www.nuniL.ors/,
2006—10-一25.
『41 R0ger S.Pressman.软件工程——实践者的研究方法(第 5
版 )『M1.北京:机械工业出版社,2004.
可以看出,优化后的方案在满足约束条件的情
况下,降低了变压器重量,降重达到5.4%,而且损
耗有所降低。
5 结 语
本文用遗传算法对电力机车牵引变压器的设
计过程进行优化,以变压器重量作为优化目标,并且
对传统遗传算法进行了一些改进,编写了一套计算
软件,实践证明这种方法是有效的。
参考文献:
【1】王小平,曹立明.遗传
算法——理论、应用与
软件实现 【M】.西安:西
安交通大学出 版社 ,
2002.
『2】周明,孙树栋.遗传算
法原理及应用 【M1.北
京:国防工业 出版社 ,
1999.
『31吴星,齐虹,陈冲.一种
改进的遗传算法及其
性能研究叨.福建工程
学院学报,2006,4(4):
407—410.
维普资讯
第 26 卷第 5 期 唐金鹏,等z测试驱动开发应用研究 21
public string Name
get{return ;}
set{=value; }
public string Pwd
get {return pwdTextbox. Text ; }
set{=value; }
public string ErrorMessage
get{return ;}
set{ errormessageTextbox. Text=value; }
2 结论
(上接第 14 页 (CPropertySheet)和若干个属性
页类(CPropertyPage) 。
结果输出模块调用 Excel 程序,把计算结果用
Excel 的形式表示出来,清晰易查。
身份验证模块用于管理用户名和密码,实现添
加、删除用户,验证密码,修改密码等功能。
4 优化结果
采用改进遗传算法优化后结果见表 10
表 1 优化设计结果
原始方案
铁心截面积(cm2 )
高压绕组规格(mm) ( x )/(2 x )
优 高压绕组段数 30
化 高压绕组匣数 1 108
变 [l5( x 7. 1) ]1 量牵引绕组规格(mm) (13拍 x )
牵引绕组并联 2 x 15 导线数
磁密(T) 15
约 短路阻抗(%) 33
束 最大温升(K) 58
条 损耗(kW)
件 变压器重量(kg) 5500
降重率(%)
目前测试驱动开发得到了越来越多人的关注。
本文说明了如何实施测试驱动。当然,测试驱动开
发有许多难点,例如如何测试数据库和分布式系统。
测试驱动开发在本项目中作为一个尝试,占整个开
发的一小部分,虽然适应它需要一段时间,但它对
我们整个项目产生了很重要的影响,提高了代码的
质量,帮助我们设计了具有可测试性的代码。
参考文献:
.[1] Kent Beck测试驱动开发阳].北京:中国电力出版社,2∞3.
[2] Kent programming explained: Embrace
change[J].Addison-Wesley , 1999 , (4).
[3] Release [DB/OL]. ,
2∞6-10-25.
[4] Roger .软件工程一一实践者的研究方法(第 5
版 )[M]北京:机械工业出版社, 2∞4.
可以看出,优化后的方案在满足约束条件的情
况下,降低了变压器重量,降重达到~.4%,而且损
耗有所降低。
5 结语
本文用遗传算法对电力机车牵引变压器的设
计过程进行优化,以变压器重量作为优化目标,并且
对传统遗传算法进行了一些改进,编写了→套计算
软件,实践证明这种方法是有效的。
优化方案
参考文献:
( x )/(2 x ) [1] 王小平,曹立明.遗传算法一一理论、应用与
26
1 167
软件实现 [M].西安:西
[l5( x )]1 安交通大学出版社,
( x ) 2∞2.
[2] 周明,列树栋.遗传算
2 x 15 法原理及应用 [M].北
京:国防工业出版社,
38 1999.
53 [3] 吴星,齐虹,陈冲.一种
改进的遗传算法及其
52∞ 性能研究囚.福建工程
学院学报,2∞6 ,4(4):
407-410.