1.5.3 网站主页实现过程
本模块使用的数据表:tb_LeaguerInfo。
1.设计步骤
(1)在网站的根目录下新建一个Web窗体,默认名称为Default.aspx,并且将其作为MasterPage.master母版页的内容页,该过程已经在1.5.2节中详细讲解,Default.aspx主要用于网站的主页。
(2)在Web窗体的Content区域添加一个Table表格,用于页面的布局。
(3)在Web窗体Content区域的Table中添加6个DataList数据服务器控件,主要用于显示各种类型的部分供求信息。
(4)在添加的6个DataList数据服务器控件中分别添加一个Table,用于DataList控件的布局,并绑定相应的数据。在ASPX页中实现绑定代码如下:
<ItemTemplate>
<table align="center" cellpadding="0" cellspacing="0" width="266">
<tr>
<td>
<span class="hong" style="color: #000000">·<a class="huise" href="ShowLeaguerInfo.aspx?id=<%#DataBinder.Eval(Container.DataItem,"id") %>" target="_blank"><%#DataBinder.Eval(Container.DataItem,"title") %></a></span></td>
</tr>
<tr style="color: #000000">
<td>
<img height="1" src="images/line.gif" width="266" /></td>
</tr>
</table>
</ItemTemplate>
2.实现代码
在主页Web窗体的加载事件中将各种类型的部分供求信息绑定到DataList控件。实现代码如下:
例程18 代码位置:光盘\TM\01\SIS\ Default.aspx.cs
Operation operation = new Operation(); //声明网站业务类对象
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack) //!IsPostBack避免重复刷新加载页面
{
//获取前6条分类供求信息
dlZP.DataSource = operation.SelectLeaguerInfo(true, "招聘信息", 6);
dlZP.DataBind();
dlPX.DataSource = operation.SelectLeaguerInfo(true, "培训信息", 6);
dlPX.DataBind();
dlGY.DataSource = operation.SelectLeaguerInfo(true, "公寓信息", 6);
dlGY.DataBind();
dlJJ.DataSource = operation.SelectLeaguerInfo(true, "家教信息", 6);
dlJJ.DataBind();
dlWPQG.DataSource = operation.SelectLeaguerInfo(true, "物品求购", 6);
dlWPQG.DataBind();
dlWPCS.DataSource = operation.SelectLeaguerInfo(true, "物品出售", 6);
dlWPCS.DataBind();
dlQDCD.DataSource = operation.SelectLeaguerInfo(true, "求兑出兑", 6);
dlQDCD.DataBind();
dlCL.DataSource = operation.SelectLeaguerInfo(true, "车辆信息", 6);
dlCL.DataBind();
}
}
代码贴士
Page.IsPostBack属性:获取一个值,该值指示该页是否正为响应客户端回发而加载,或者它是否正被首次加载和访问。如果是为响应客户端回发而加载该页,则为True;否则为False。
SelectLeaguerInfo()方法:自定义业务层类中方法,用于查询同类型收费到期和未到期供求信息(前n条信息),True显示过期信息,False显示未过期信息。
1.5.4 单元测试
在现代软件开发过程中,测试不再作为一个独立的生命周期。单元测试成为与编写代码同步进行的开发活动。单元测试能够提高程序员对程序的信心,保证程序的质量,加快软件开发速度,使程序易于维护。
1.单元测试概述
单元测试是要在软件开发过程中进行的最低级别的测试活动。在单元测试活动中,软件的独立单元将在与程序的其他部分相隔离的情况下进行测试。
在一种传统的结构化编程语言,如C语言中,要进行测试的单元一般是函数或子过程。在像C++这样的面向对象的语言中,要进行测试的基本单元是类。单元测试不仅仅是作为无错编码的一种辅助手段在一次性开发过程中使用,单元测试必须是可重复的,无论是在软件修改,或是移植到新的运行环境的过程中。因此,所有的测试都必须在整个软件系统的生命周期中进行维护。
经常与单元测试联系起来的另外一些开发活动包括代码走读(Code Review)、静态分析(Static Analysis)和动态分析(Dynamic Analysis)。静态分析就是对软件的源代码进行研读,查找错误或收集一些度量数据,并不需要对代码进行编译和执行。动态分析就是通过观察软件运行时的动作,来提供执行跟踪、时间分析以及测试覆盖度方面的信息。
2.单元测试的优点
一种验证行为。
程序中的每一项功能都是通过测试来验证它的正确性。单元测试为以后的开发提供支援,就算是开发后期,也可以轻松地增加功能或更改程序结构,而不用担心这个过程会破坏重要的东西,而且它为代码的重构提供了保障。这样,我们就可以更自由地对程序进行改进。
一种设计行为。
编写单元测试将使我们从调用者的角度观察、思考。特别是先写测试(test-first),迫使我们把程序设计成易于调用和可测试的,即解除软件中的耦合。
一种编写文档的行为。
单元测试是一种无价的文档,它是展示函数或类如何使用的最佳文档。这份文档是可编译、可运行的,并且它保持最新,永远与代码同步。
具有回归性。
自动化的单元测试避免了代码出现回归,编写完成之后,可以随时随地地快速运行测试。
3.越到项目后期,单元测试为何越难进行
在很多项目的初期,项目中的大部分程序员都能够自觉地去编写单元测试。随着项目的进行、任务的加重、离交付时间越来越近,不能按时完成项目的风险越来越大,单元测试就往往成为牺牲品。项目经理因为进度的压力也不重视了,程序员也因为编码的压力和无人看管而不再为代码编写单元测试了。笔者亲身经历的项目都或多或少地发生过类似的事情。越是在项目的后期,能坚持编写单元测试的程序在整个项目组中所占的项目比例越低。
为了追赶项目进度,多数程序员将没有经过任何测试的程序代码上传到版本控制系统,项目经理也不再追问,照单全收。这样做的结果就是在项目后期,技术骨干人员只好加班加点进行系统集成。集成完之后,下发给测试人员测试时,Bug的报告数量翻倍增长。程序员开始修改Bug,但还有非常多的Bug隐藏得很深,一直潜伏到生产环境中。
总之,在现代软件开发过程中,测试不再作为一个独立的生命周期,单元测试成为与编写代码同步进行的开发活动。单元测试能够提高程序员对程序的信心、保证程序的质量、加快软件开发速度,并使程序易于维护。没有单元测试是绝对不行的。
4.NUnit单元测试工具的介绍与使用
(1)NUnit使用前介绍
NUnit是一个单元测试框架,是专门针对测试.NET开发的程序,同类产品还包括JUnit(Java)、CPPUnit(C++),都属于xUnit中的成员。NUnit是xUnit家族中的第4个主打产品,完全由C#语言来编写,目前NUnit的最新版本是NUnit 2.4.3,可以到https://www.nunit.org/网站下载。
下面正式讲解Nunit。在讲解之前先来看一下单元测试的运行效果,如图1.28和图1.29所示。