C#单元测试:将NUNIT / MBUNIT与MIcrosoft PEX集成

时间:2011-10-21 02:02:04

标签: c# nunit mbunit

C#单元测试:如何将NUNIT / MBUNIT与Microsoft PEX集成(参数化单元测试)。 在我看过很少的Microsoft PEX视频之后,想知道我是否能够在我的NUNIT测试项目中添加PEX测试,并且还希望将它们添加到每晚构建中。这可能吗?

1 个答案:

答案 0 :(得分:3)

是的,有可能。

我们运行CruiseControl.Net NAnt正在运行的MSBuild,NUnitCode ContractsPex,这是一个非常普通的(非流端政府风格)设置。使用Pex Visual Studio(专业版)GUI生成测试,然后将生成的文件签入我们的SVN。服务器上没有额外的Pex步骤,但它仍然作为普通测试套件运行所有NUnit测试。由于我们正在使用代码合同,因此仍需要运行代码合同构建后步骤。

在Visual Studio中运行Pex以生成参数化测试时,它将允许您选择要使用的测试框架。对于新项目,请选择NUnit,然后在出现提示时,浏览到包含与项目关联的nunit.framework.dll的文件夹。

到目前为止(至少在我的部门中的每个人都习惯了Pex之前),我们已经将生成的Pex测试中的手写测试与每个代码项目的两个测试项目分开。例如,Product.XYZ同时具有Product.XYZ.Tests(普通的,手写的NUnit测试)和Product.XYZ.PexTests(仅生成测试的完全生成的项目)。在手写测试中,我们编写预期的(基于业务案例的)输入和结果,然后使用Pex确保我们不会遗漏任何潜在危险的前置或后置条件。两个测试套件都在开发人员机器ReSharper test runner和CCNet构建服务器上自动执行,另外我们使用OpenCover进行代码覆盖率检查。

使用Pex和代码合约without installing them on the build server

下面是我正在写的一些新鲜的笔记。可能会被移动或删除。

请注意,无需在构建服务器上运行Pex和Code Contracts的安装程序。如果您有可能使用冲突版本的Pex或代码约定的吝啬系统管理员或项目,这会有所帮助。 Moles仍为has to be installed on the build server,因此如果使用Moles,请跳过此步骤。

  1. 让Pex为您生成一个NUnit测试项目Product.XYZ.PexTests。生成一些(仅开始一个或两个)参数化Pex方法测试,并让Pex使用实际的NUnit测试生成.g.cs文件。
  2. 为您的解决方案制作Microsoft.Pex.Framework.dll的本地副本,然后重新添加本地副本的Product.XYZ.PexTests项目参考。移除您的.moles和对Moles的引用,Microsoft.ExtendedReflection.dllMicrosoft.Moles.Framework.dll
  3. 将已安装的Code Contracts文件复制到解决方案的构建工具文件夹中。 (您可以稍后清除一些未使用的非构建文件。)
  4. 在构建之前将变量CodeContractsInstallDir设置为指向Code Contracts文件夹(包括尾部斜杠)(例如,在构建脚本中)。
  5. 在代码项目的Microsoft.CodeContracts.targets文件中的其他<Import />代码后导入Product.XYZ.csproj(见下文)。
  6. (可选)在代码项目</Project> Product.XYZ.csproj之前添加代码约定构建时间检查(请参阅下面的XML)。您可能希望根据是否仅为某些构建启用了代码约定运行时检查来移动检查。
  7. 通过在构建服务器上构建和运行测试来测试Pex设置。
  8. 代码合同构建目标导入

    <Import Project="$(CodeContractsInstallDir)MsBuild\v4.0\Microsoft.CodeContracts.targets" />
    

    代码合同检查from userdoc.pdf chapter 5.1.3

    <PropertyGroup>
      <CompileDependsOn>$(CompileDependsOn);CheckForCodeContracts</CompileDependsOn>
    </PropertyGroup>
    <Target Name="CheckForCodeContracts" Condition="'$(CodeContractsImported)' != 'true'">
      <Error Text="Project requires Code Contracts" />
    </Target>