卸载VS2005 SP1,安装VS2008的一系列问题及其解决

2008/02/25 | 22:22 | 分类:Windows开发 | 标签: | 1,544次阅读

  卸载VS2005 SP1,安装VS2008,花了我N多时间。出现的一系列问题通过google并摸索实验找到了答案,总结如下:

 

●卸载VS2005时找不到vs_setup.msi:
  这个问题网上谈得多了,是安装VS2005 SP1之后引起的。只需删除注册表中HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Installer\Products\下包含vs_setup.msi的那个子项中的Patches子项。

 

●去掉0-day版ISO中的序列号,改为正版序列号安装:
  我们校园网上只有0-day版的VS2008,用0-day版的序列号有可能影响将来的升级和使用。现在Microsoft的DreamSpark计划已经为学生提供VS2008正版序列号了。但我懒得去下载原版ISO,直接修改0-day版ISO中的序列号即可。方法是用高版本(3.71)的WinRAR解压0-day版ISO,修改解开后的Setup\setup.sdb文件,删除[Product Key]字段,这时再运行解压后的安装程序就可以输入正版序列号了。

 

●安装VS2008时无法打开e:\vs_setup.msi:
  这个问题耽搁得最久。事实上我安装VS2008的源盘和目标盘都不是e盘!这里很奇怪它为什么报这个错。即使将vs_setup.msi复制到e盘根目录,仍然报这个错。后来删除注册表中与VS2005相关的所有键值(*\Microsoft\VisualStudio\8.0),然后搜索并删除Users文件夹中所有用户关于VS2005的配置文件,清空Temp文件夹,才得以解决。

 

●安装Web Authoring Component时失败:
  用WinRAR将安装盘中的WCU\WebDesignerCore\WebDesignerCore.EXE文件解压,运行解开后的setup.exe安装。

 

●安装.Net Framework 3.5时失败:
  从Microsoft网站下载安装单行版的.Net Framework 3.5,用Administrator帐号安装即可。

 

●安装.Net Compact Framework 2.0 SP2及.Net Compact Framework 3.5时失败:
  从Microsoft网站下载两种单行版的.Net Compact Framework,文件名分别为NETCFSetupv2.msi、NETCFSetupv35.msi,覆盖ISO的WCU\NetCF\目录下的同名文件,然后重新安装VS2008即可。(不知道是不是这个0-day版ISO的问题,ISO本身的MD5是正确的,但ISO中的NETCFSetupv2.msi及NETCFSetupv35.msi似乎是损坏的,无法运行,它们与Microsoft网站下载对应文件大小相同而MD5不同)

 

  几个小时周折之后,终于success了!哎呀呀呀——太不容易了。

用 Visual Studio 2005 实现用户界面自动化测试

2006/02/06 | 06:33 | 分类:Windows开发 | 标签: | 467次阅读

  Visual Studio 2005 新增的测试功能使我们的开发工作更为快捷,代码质量在一定程度上有所提高。想必大家对类的单元测试已经比较熟悉,这里我们来看看它提供的另一项更为有趣的测试——用户界面自动化测试。事实上这个测试的本质仍是单元测试,单元测试的各种方法在用户界面测试中仍然可用。

  我们以一个简单的 Windows Form 应用程序为例(在 Visual Studio 2005 Team System 下演示,其它版本亦可参考)。如图所示,这是一个一元二次方程的求解程序。

用 Visual Studio 2005 实现用户界面自动化测试

  在 Visual Studio 2005 中加载这个程序的工程,切换到待测试窗体(Form1)的源代码视图。添加一个用户界面测试最简单的方法是在事件函数声明代码上右击鼠标,在快捷菜单中点击“Create Unit Tests”。在弹出的对话框中点选待测试的函数(特别是事件函数),确定。当然,手工添加一个单元测试项目也是可以的,但通过快捷菜单自动生成的代码中包含了一些测试辅助类和对象的声明,使用起来更加方便。

  本例中,我们由 btnWorkOut_Click 创建单元测试,自动生成的代码如下:

  1. [DeploymentItem("XandY.exe")]
  2. [TestMethod()]
  3. public void btnWorkOut_ClickTest()
  4. {
  5.     Form1 target = new Form1();
  6.     MyTestProject.XandY_Form1Accessor accessor = new MyTestProject.XandY_Form1Accessor(target);
  7.     object sender = null; // TODO: Initialize to an appropriate value
  8.     EventArgs e = null; // TODO: Initialize to an appropriate value
  9.     accessor.btnWorkOut_Click(sender, e);
  10.     Assert.Inconclusive("A method that does not return a value cannot be verified.");
  11. }

  熟悉单元测试的朋友应该明白 [TestMethod()] 属性的含义。在这个测试函数中,target 是待测试窗体的一个实例。sender 和 e 是各个事件函数必备的参数,一般情况下取 null 即可。最重要的是 accessor 对象,它是我们进行用户界面自动化测试的“总代理”。通过它可以访问到待测试窗体的各个方法、属性和控件,并可调用控件已声明的各个事件。由此,我们可以用 accessor 模拟使用者通过键盘、鼠标对用户界面的各项操作,同时即时获知程序中各个变量的状态。有兴趣的朋友可以读读 XandY_Form1Accessor 类的定义,了解这个“总代理”工作的奥秘。

  我们对测试代码进行以下修改,以便对程序运行的正确性进行测试。

  1. [DeploymentItem("XandY.exe")]
  2. [TestMethod()]
  3. public void btnWorkOut_ClickTest()
  4. {
  5.     Form1 target = new Form1();
  6.     MyTestProject.XandY_Form1Accessor accessor = new MyTestProject.XandY_Form1Accessor(target);
  7.     object sender = null; // TODO: Initialize to an appropriate value
  8.     EventArgs e = null; // TODO: Initialize to an appropriate value
  9.     target.Show();
  10.     target.Refresh();
  11.     System.Threading.Thread.Sleep(1000);
  12.     accessor.textBox1.Text = "2";
  13.     accessor.textBox2.Text = "4";
  14.     accessor.textBox3.Text = "2";
  15.     target.Refresh();
  16.     System.Threading.Thread.Sleep(1000);
  17.     accessor.btnWorkOut_Click(sender, e);
  18.     target.Refresh();
  19.     Assert.IsTrue(accessor.d >= 0);
  20.     Assert.IsNotNull(accessor.xx);
  21.     Assert.IsNotNull(accessor.xy);
  22.     Console.WriteLine("X1 = " + accessor.textBox4.Text);
  23.     Console.WriteLine("X2 = " + accessor.textBox5.Text);
  24.     System.Threading.Thread.Sleep(1000);
  25.     target.Close();
  26. }

  以上代码中,我们通过 target.Show() 呈现窗体,通过 target.Refresh() 可以即时地刷新窗体内容在屏幕的显示,通过 System.Threading.Thread.Sleep(1000) 来延时。这几段代码都不是必需的,加入它们是为了便于程序反应和测试者观察,我们也完全可以在不显示用户界面的情况下更快地运行自动测试。至于用 Assert 来监控变量状态和用 Console 做输出,用过单元测试的朋友都应该了解。

  此时,我们运行这个测试,就会在屏幕上先后看到窗体被加载,三个文本框被填入数据,计算结果出现在下面的文本框中,最后窗体被关闭。

  再来看看测试结果的输出,符合我们的预期。

用 Visual Studio 2005 实现用户界面自动化测试

  Visual Studio 2005 的用户界面自动化测试就是这么简单。对于一般的测试,它使测试人员不必深究应用程序底层的实现。当然,对于本例这样简单的程序,我们用不着这么麻烦的测试,但是对于用户界面更加复杂的程序,操作上存在更多的组合方式,手工测试的繁琐程度以及查找问题的难度便大大上升了。使用 Visual Studio 2005 提供的自动化测试手段将在很大程度上减轻测试人员的负担。有兴趣的朋友甚至可以在这个基础上进行二次开发,引入自动化测试脚本等专业测试方案,实现通用性更强的用户界面自动化测试。

  参考文献:James McCaffrey,用 .NET 开发的轻量级 UI 测试自动化,MSDN,URL:http://www.microsoft.com/china/MSDN/library/enterprisedevelopment/softwaredev/us0501TestRun.mspx

使用.Net IDE的一点小技巧

2005/08/13 | 12:03 | 分类:Windows开发 | 标签: | 515次阅读

[VS.Net]快速定位到修改点

   

我和几个同学合作一个项目,项目不大,没有使用什么版本管理系统。为了让别人知道自己修改了什么地方,我们要在自己修改的源代码处加上注释。但每个人的注释风格不同,查找起来很不方便。后来我找到一个简单的解决方案:在修改处加上具有统一开始字符的注释(如“MODIFY”):

    'MODIFY 小李 2005-6-22 改正连接字串为空时出现异常的bug

    ......

    'MODIFY 小王 2005-6-23 添加Access接口

    ......

然后在VS.Net的工具—选项对话框的环境—任务列表中添加“MODIFY”这个注释标记,并在VS.Net在任务列表标签页上点右键,设置显示任务为全部,以后就可以通过任务列表快速定位到源代码中的修改点了。

 

[VS.Net]在同一标签页内查看同一文件的两个复本

 

我们在写程序时,往往要参考同一文件的其他部分。在VS.Net可以方便地在同一标签页内查看同一文件的两个复本,方法就是用鼠标向下拖动窗体滚动条上方的小矩形,同一文件就可以呈现在两个子窗体中了,而且它们的更新是同步的。(注:这是Microsoft通用的方法,在WordExcel中都可以使用)

 

[SharpDevelop]VB.NetC#代码相互转化

   

我们在进行.Net编程时常常遇到要将VB.NetC#代码相互转化的情况。我在网上搜索过一些小工具,它们要么是在线使用的,要么是收费的,挺不尽人意。事实上有一个免费的选择,就是著名的GNU .Net IDE——SharpDevelop(目前我使用的版本是1.1.0),它的工具菜单里就有VB.NetC#代码相互转化功能。转化效果总体不错,不过也存在一点小问题(比如VB.NetC#时,调用没有参数的方法,不会自动加上括号),但这总比人工转换省事多了。大家不妨试试。

   

[Mono]FC4下忽略依赖性,快速安装Mono

 

Linux下玩.Net编程似乎很酷的样子,我也跟风,下载了一套MonoRPM for FC3版本),一解压,几个文件夹一共有几十个RPM,不知道应该先安装谁。试验安装了几个,总是说找不到依赖项。我的系统是FC4,它是为FC3设计的,问题应该不大,干脆不管RPM的依赖性了,把所有的RPM集中在一个文件夹,一古脑地用忽略依赖性的方法安装:

rpm -i * --nodeps

结果如何呢?试用了一下安装好的MonoDevelop,编译了一个简单的程序,又导入了一个VS.Net Console工程,运行都正常!

 

不过后来有时间,我还是仔细看了一下这些RPM的依赖性,发现了两个问题:负责webserverxsp需要一些Linux服务器依赖项,在FC4的默认安装中没有,重装xsp,放入FC4 DVD,完成添加;mono-data-sqlite需要libsqlite,但我没有找到它,上网查了,它顾名思义是个轻型SQL软件包,自己暂时不用,就不安装了吧!