Unit testing &引用;“入门”;NUnit(或NUnitLite)和.NET的问题CF

Unit testing &引用;“入门”;NUnit(或NUnitLite)和.NET的问题CF,unit-testing,compact-framework,nunit,Unit Testing,Compact Framework,Nunit,我有一个现有的VS2005STD.NETCompactFramework应用程序,我想对它进行一些主要的重构。目前还没有单元测试,但我想在处理代码之前添加它。我没有单元测试的实际经验,尽管我知道这个理论(只是从来没有真正实现过它;我知道:我感到羞耻:-) 以下是我目前正在思考的一些问题: a) 作为一个初学者,我应该使用NUnit还是NUnitLite(据说更容易使用) b) 我的目标是在移动设备上还是在桌面上运行测试(当然,特定于设备的代码除外)?目前桌面看起来更吸引人,尤其是在自动构建中包含

我有一个现有的VS2005STD.NETCompactFramework应用程序,我想对它进行一些主要的重构。目前还没有单元测试,但我想在处理代码之前添加它。我没有单元测试的实际经验,尽管我知道这个理论(只是从来没有真正实现过它;我知道:我感到羞耻:-) 以下是我目前正在思考的一些问题:

a) 作为一个初学者,我应该使用NUnit还是NUnitLite(据说更容易使用)

b) 我的目标是在移动设备上还是在桌面上运行测试(当然,特定于设备的代码除外)?目前桌面看起来更吸引人,尤其是在自动构建中包含测试

c) 我想测试的类通常是如何包含在测试项目中的?我的应用程序是一个.EXE文件,也就是说,我不能像测试项目中的.DLL程序集那样引用它(或者我可以?从未尝试过…)。我查看了各种NUnit教程,但要么没有提到这一点,要么有一个教程建议将我要测试的类复制并粘贴到测试项目中(YK!)。我应该链接到测试项目中的原始源代码文件吗?那么私有方法或对其他类的依赖性呢

d) 我是否应该开始修改我的原始代码以允许更好的可测试性,例如公开私有方法、解耦等。?这有点像测试前的重构,这听起来不太好。。。或者一开始就不接触原始代码是更好的做法,即使这意味着更少的代码覆盖率等等

e) 我应该看看大多数人使用的其他工具或插件吗


提前感谢您提供的所有答案(如果这些答案只针对上述一项或部分内容,我也非常感谢)。

首先,我向您推荐一本关于单元测试的好书:

它将向您介绍NUnit,但更重要的是,作者将为您提供许多关于如何编写良好的单元测试的建议。xUnit测试框架并不十分复杂,您将很快习惯它们的API/工作流。挑战在于识别边界条件、减少耦合和设计可测试性的实际过程。它可以作为电子书(PDF)或印刷本提供

关于你的实际问题(本书也会给你一些答案):

  • @a) 我没有NUnit lite的经验,因此在这一点上我不能给你任何建议
  • @b) 单元测试在依赖性方面应该是非常局部的。您的目标是测试彼此独立的类,因此无需首先将其部署到移动设备上。您不会运行完整的应用程序,只需单独测试组件。因此,我建议使用桌面计算机作为单元测试环境的目标。你也会有更好的转身时间
  • @c) 必须引用包含要在测试项目中测试的类的程序集。测试项目将是程序集本身(DLL)。测试运行程序执行此程序集,并使用存储的元信息运行包含的测试用例
  • @d) 这在很大程度上取决于软件的状态和设计。但总的来说,我会使用分而治之的策略:在类之间引入接口并开始一步一步地重构。在开始更改实现之前编写单元测试。这些接口使契约保持正常运行,但如果需要,您可以更改底层实现。不要仅仅为了使私有方法可测试而将其公开。私有方法是类的内部助手,支持公共方法完成其工作。既然您测试了您的公共方法,那么您将断言您的私有方法做了正确的事情
  • @e) Visual Studio的一个有用的外接程序是。它允许您直接从IDE运行NUnit测试,而无需更改为NUnit的GUI或控制台运行程序
@c)我还没有尝试过,但我认为VisualStudio可以让您将项目引用从测试程序集添加到实际的代码程序集,即使它是一个exe

至于私有方法之类的,通常我不测试私有方法。理论上,所有私人物品都应该通过公共或内部方法使用,因此测试这些物品应该间接测试私人物品

不过我确实测试了公共和内部。我发现一个非常有用的特性:

[assembly:InternalsVisibleTo("MyTestAssembly")]

可用于使一个部件的内部构件对另一个部件可见。我使用此属性将内部构件公开给我的测试程序集,以便它可以直接引用它们。

+1本好书。根据某人的建议购买了它,但一点也不后悔(特别是整个实用入门套件)