问题: 我们编写代码时定会反复调试保证它能够编译通过
但代码通过编译只是介绍说明了它语法正确
却无法保证它语义也定正确
也就是不能轻易承诺这段代码行为定是正确
而编写单元测试可以验证代码行为而我们期望是否致
而使用单元测试来测试自己代码般是越早越好
最好是写第行代码时候就已经开始了
那么Silverlight如何进行单元测试呢?
环境配置: 非常高兴告诉大家微软给我们提供了单元测试支持
要进行Silverlight单元测试你需要完成下面两步步骤
1.下载Silverlight Unit Test VS模板以及Silverlight Unit Test Framework Binaries库
Silverlight Unit Test templates (Zip, 46K)
Silverlight Unit Test Framework binaries (Zip, 284k)
Silverlight Unit Test文档 (Zip, 1881K)
2.解压下载后Silverlight Unit Test templates包
并将里面包含SilverlightTestProject_CSharp.zip以及SilverlightTestProject_VB.zip文件拷贝到(不要再把上述两个.zip文件解压了不然VS不认)
%userprofile%DocumentsVisual Studio 2008TemplatesProjectTemplates
而将SilverlightTestClass_CSharp.zip以及SilverlightTestClass_VB.zip文件拷贝到
%userprofile%DocumentsVisual Studio 2008TemplatesItemTemplates
解压下载下来后Silverlight Unit Test Framework Binaries并将里面东西拷贝到如下目录下:
C:Program FilesMicrosoft SDKsSilverlightv2.0LibrariesClient
启动VS2008如果出现下面所示模板
介绍说明我们VS2008已经配置成功
已经支持Silverlight Unit Test
解决方案: 好下面就让我们来做些单元测试把
如下图所示创建个Silverlight Test Project如下
该工程含有文件有:
在这个工程中和普通Silverlight工程有个特别差别地方就是没有任何自定义SilverlightControl控件
那么这个工程RootVisual到底是什么呢?
咱们打开App.xaml.cs文件就可以看到如下段代码了:
1private void Application_Startup(object sender, StartupEventArgs e)
2{
3 this.RootVisual = UnitTest.CreateTestPage;
4}
其中UnitTest是Microsoft.Silverlight.Testing名字Control控件下个类
而CreateTestPage思路方法将创建个UIElement如下图所示
修改Test.cs为:
1[TestMethod]
2public void TestMethod
3{
4 Assert.IsTrue(true);
5}
运行结果如下:
它将告诉你这个断言(Assert是否正确已经操作这个过程花了多少时间)
你如果将Assert.IsTrue(true)改成Assert.IsTrue(false),将出现如下界面
说到这里大家肯定要纳闷我为什么非得用单元测试呢?
看起来这个没有什么用处啊?
我讲下如下种情况大家可能就可以知道单元测试多有用了
设想下你今天刚刚完成段代码但是你想测试下他到底工作得对不对
平时你应该会是去试验每个情况点至每个按钮看看是否工作正常
这时候你肯定会很郁闷特别是出bug时候
需要查看每段代码来了解到底是哪里出错
有时候你还不得不通宵但是有个单元测试
你可以用少量时间写些单元测试代码来测试下每个变量变化情况
而且这个工作你可以在快离开公司时候让这个Unit Test运行起来
第 2天来查看下有几个是绿(也就是按照预期运行)还有那几个是红色(没有按照预期运行)
这样你可以安心睡觉而且工作效率也高
空口无凭展示范例如下:
1.首先在UnitTest4Silverlight工程中添加个叫做SilverlightAppSilverlight Application
并设置启动工程还是UnitTest4Silverlight工程
2.修改Page.xamlUI如下代码所示
1<UserControl x:Class="SilverlightApp.Page"
2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation%22
3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml%22
4 Width="400" Height="300">
5 <Grid x:Name="LayoutRoot" Background="#3C3C3C">
6 <Button x:Name="btn" Content="Unit Test" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="20" Padding="20,5" Click="btn_Click"/>
7 </Grid>
8</UserControl>
3.修改Page.xaml.cs代码如下:
1public clickedNum = 0;
2
3public Page
4{
5 InitializeComponent;
6}
7
8public void btn_Click(object sender, RoutedEventArgs e)
9{
10 clickedNum;
11}
请暂时性将所有变量以及思路方法设置成public
重新编译下整个工程
4.在UnitTest4Silverlight工程中添加对SilverlightApp引用如下
5.修改UnitTest4Silverlight工程中Test.cs文件如下:
1using ;
2using .Collections.Generic;
3using Microsoft.VisualStudio.TestTools.UnitTesting;
4using SilverlightApp;
5
6 UnitTest4Silverlight
7{
8 [TestClass]
9 public Test
10 {
11 private Page page= Page;
12
13 private void TestClick
14 {
15 page.btn_Click(this, null);
16 }
17
18 [TestMethod]
19 public void TestMethod
20 {
21 TestClick;
22 TestClick;
23 TestClick;
24 TestClick;
25 Assert.AreEqual(page.clickedNum, 3);
26 }
27 }
28}
由于我们已经点击了 4次鼠标(TestClick这个点击)
clickedNum应该已经增加到了4但是我们断言(Assert)clickedNum=3
明显有bug所以运行后结果如下:
你可以看到期望值应该是4但是我们传给是3明显不对修改这个bug我们将得到如下运行结果
当然实际工程中Unit Test不会这么简单
Unit Test更多功能请参看SDK以及专业软件Software测试书籍
结语: 本文展示了如何在Silverlight中运用Unit Test来提高工作效率
最新评论