`
阅读更多

.NET 2.0中友元程序集(Friend Assemblies)功能对于单元测试来说非常有用,通过这一功能可以分离测试代码和主程序的实际功能代码,但MSDN上的文档将通过InternalsVisibleToAttribute建立友元程序集和强签名(Strong Name)放在一起说明,其实这是两个功能是没有相互关联的。

强签名是为了保证发布的程序集唯一性,从而保证不被冒用和篡改。友元程序集则允许指定的程序集可以访问具有特定InternalsVisibleToAttribute属性程序集的internal修饰的接口和类,这相当于在主程序集上开了一个后门,只有指定的单元测试Test.DLL能够访问内部功能。

其实,分离测试和程序集只需在主程序集中声明InternalsVisibleToAttribute属性即可,一般在AssemblyInfo.cs上插入这一属性:

[assembly: InternalsVisibleToAttribute("TSE.DESE.Test")]

这样就允许程序集TSE.DESE的单元测试DLL,程序集的名称(查看方法:项目->属性->应用程序->程序集名称)为TSE.DESE.Test访问TSE.DESE主程序集的internal内部类和接口。

以上设置虽然方便,但是,如果发布TSE.DESE的话,.NET将允许任何程序集名称为“TSE.DESE.Test”访问TSE.DESE的内部,这是一个不大不小的后门,所以最好将上述语句用C#的预处理语句包裹起来,变成:

#if DEBUG
[assembly: InternalsVisibleToAttribute(
"TSE.DESE.Test")]
#endif

这样,当选择Release时,主程序集也就没有了InternalsVisibleToAttribute属性,从而保证了的安全性,当然,此时Release编译的TSE.DESE.Test也将出错,所以应该在Release编译时跳过生成程序集TSE.DESE.Test。

当然这一方法的安全性不如MSDN上方法,但起码非常方便,也不用通过一系列sn命令获得非常长的PublicKey。

PS:MSDN的InternalsVisibleToAttribute构造函数文档有错误,PublicKey不是PublicKeyToken,因此下面的示例是错误的:

[assembly:InternalsVisibleToAttribute("AssemblyB, PublicKey=32ab4ba45e0a69a1")]
正确的应该形如:
[assembly:InternalsVisibleTo("cs_friend_assemblies_4, PublicKey=002400000480
0000940000000602000000240000525341310004000001000100031d7b6f3abc16c7de526fd6
7ec2926fe68ed2f9901afbc5f1b6b428bf6cd9086021a0b38b76bc340dc6ab27b65e4a593fa0
e60689ac98dd71a12248ca025751d135df7b98c5f9d09172f7b62dabdd302b2a1ae688731ff3
fc7a6ab9e8cf39fb73c60667e1b071ef7da5838dc009ae0119a9cbff2c581fc0f2d966b77114
b2c4
")]

2007年3月29号补充:

即使不应用程序集签名,还是需要在被测试的主程序集上注释掉下列三行,原因不明,也许是微软出品的又一个bug,可能和VS.NET 2005 SP1相关

<!---->//[assembly: AssemblyDelaySign(false)]
//[assembly: AssemblyKeyFile("")]
//[assembly: AssemblyKeyName("")]

分享到:
评论

相关推荐

    Nunit.dll+详细使用方法

    **NUnit:强大的单元测试框架** NUnit 是一个开源的、广泛使用的单元测试框架,它为.NET开发者提供了方便快捷的单元测试能力。NUnit 支持多种.NET版本,包括.NET Framework、.NET Core以及.NET Standard,使其在...

    Nunit测试的一个小例子

    这个简单的NUnit测试例子展示了如何在C#项目中设置和执行单元测试。了解并熟练掌握单元测试对于提升开发效率和软件质量至关重要。通过持续的测试和重构,我们可以构建出更稳定、更可靠的软件系统。

    NUnit测试代码报告

    边界值测试是一种重要的软件测试方法,旨在确保程序在处理数据边界情况时能正常工作。 首先,我们要理解什么是单元测试。单元测试是对软件中的最小可测试单元进行检查和验证,如函数、方法或类。NUnit提供了一套...

    nunit.framework.dll很有用的

    标题中的“nunit.framework.dll”是指NUnit框架的动态链接库文件,这是一个广泛使用的开源单元测试框架,主要用于.NET应用程序的测试。NUnit提供了一个简单、灵活的接口来编写和运行测试,确保代码的质量和功能正确...

    Nunit单元测试工具

    1. **测试编写**:NUnit提供了多种测试类型,如测试方法(Assert)、固定断言(Constraint)以及更复杂的测试构造,如参数化测试和测试数据驱动。开发者可以通过简单的注解(如 `[Test]`)来标识可执行的测试方法。 ...

    单元测试工具NUnit2.0详细使用方法

    首先,你需要从NUnit的官方网站下载NUnit2.0的安装包,它通常包含一个dll文件,如nunit.framework.dll,这是运行测试的库。将其添加到你的C#项目引用中,然后就可以在项目中使用NUnit的功能了。 **二、创建测试** ...

    单元测试—NUnit测试

    元测试对程序员来说是非常...除了官方的解决方案之外,还有一种非常好的免费开源的第三方测试工具,那就是NUnit。它是从Java中著名的JUnit单元测试框架移植过来,这个可以从官网中得到答案,http://www.nunit.org/。

    Nunit单元测试报告

    NUnit 是一个流行的开源单元测试框架,用于.NET应用程序。它为开发者提供了一种方便的方式来验证他们的代码片段,确保代码的功能正确性以及维护性。通过单元测试,开发人员可以在编码阶段发现潜在的问题,而不是在...

    nunit.framework.dll 2.6.2

    nunit.framework.dll 2.6.2

    软件测试Nunit单元测试

    单元测试是软件开发过程中的重要环节,它允许开发者对程序的最小可测试单元,如函数、方法或类,进行独立验证,确保它们按预期工作。NUnit是一个流行的开源单元测试框架,广泛应用于.NET平台,支持多种.NET语言,如...

    nunit_framework.dll

    nunit_framework.dll C#

    NUnit-2.6.2 源码 及 应用程序

    2. **测试套件(Test Suites)**:NUnit允许组织测试为测试集,通过[NUnitFixture]注解定义测试类,每个测试类可以包含多个[NUnitTest]注解的测试方法。 3. **测试运行器(Test Runner)**:NUnit附带了一个用户...

    NUnit单元测试实例

    NUnit是一个广泛使用的开源单元测试框架,主要用于.NET应用程序的测试。在C#编程环境中,NUnit为开发者提供了方便、灵活的测试工具,确保代码的质量和稳定性。本实例将深入探讨如何利用NUnit进行单元测试,以及它的...

    winform NUNIT的测试初始化和清理

    在WinForm应用中,我们可能需要在测试开始前设置特定的UI状态或者初始化某些依赖对象,这就需要用到NUnit的`SetUp`方法。`SetUp`是在每个测试方法执行前调用的,用于准备测试环境。例如,你可以在这里打开WinForm...

    NUnit单元测试方法

    NUnit 执行单元测试方法,包含public, private, protected 方法的测试方法。 NUnit单元测试 私有(private)方法单元测试 protected方法单元测试 public 方法单元测试

    Nunit测试工具

    4. **测试运行器**:NUnit测试运行器能够发现并执行所有标记为测试的方法,同时提供详细的测试结果报告,包括失败的测试、错误和警告。 5. **扩展性**:NUnit具有高度可扩展性,允许用户自定义测试适配器和扩展,以...

    NUnit详细使用方法

    2. **加载测试程序集:** 在NUnit GUI中加载含有测试用例的程序集。 3. **运行测试:** 单击运行按钮执行测试。 **高级特性:** - **参数化测试:** 使用`[TestCase]`和`[ValueSource]`等属性进行参数化测试。 - *...

Global site tag (gtag.js) - Google Analytics