【问题标题】:Running MSTest in partial trust from within Visual Studio在 Visual Studio 中以部分信任的方式运行 MSTest
【发布时间】:2011-01-12 17:11:54
【问题描述】:

我希望能够以部分信任的方式运行 MSTest。这将允许我配置我的单元测试调用的代码可以做什么和不能做什么。

我试图解决的问题是让我的自动化(单元)测试在使用文件系统、数据库、系统时钟和其他外部资源之类的东西时失败。通过在部分信任下运行,我可以配置 AppDomain 可以执行和不可以执行的操作类型。这使我能够检测代码中未正确抽象出已使用资源的位置。

如果有其他方法可以实现,请告诉我。

【问题讨论】:

  • 您希望能够控制运行单个测试的权限集,还是尝试执行一组测试的多次运行,并在每次运行时应用不同的权限集?
  • @Nicole:感谢您的回复。如果可以在同一个权限集中的单个项目中运行所有测试,我会很高兴,否则每个解决方案集都可以。不需要每次测试。
  • 项目的目标权限集是在设计时确定的,还是希望能够在执行测试时动态设置权限集?
  • 如果我可以设置一次权限(例如在测试库中)就可以了。单元测试永远不需要使用文件系统或数据库。但是,MSTest 仍会完全信任地运行程序集。我们该如何改变呢?
  • 通过应用this 扩展代码(修改),我能够使用NUnit 运行部分测试。

标签: .net visual-studio unit-testing mstest partial-trust


【解决方案1】:

很遗憾,MSTest 没有为此提供内置机制,并且 .NET 4.0 中对 CAS 策略应用程序的更改严重限制了对此支持的方法。

最简单的方法是限制 MSTest 创建的 AppDomain 上的 CAS 权限授予,以便在特定测试程序集中运行测试。但是,当前版本的 MSTest 不允许拦截和/或自定义 AppDomain 创建。我们无法通过将代码添加到 AssemblyInitialize 方法来解决此问题,因为在代码开始在 AppDomain 中运行后所做的 AppDomain 策略更改无效。

这基本上给我们留下了一个单一的支持机制来应用 CAS 权限限制进行测试:在测试方法或调用测试方法的代码中应用 PermissionSet.PermitOnly。例如:

[TestMethod]
public void SomeTest()
{
    SomeStaticTestUtilityClass.TargetPermissionSet.PermitOnly();

    // Run the rest of your test code here.
}

可以使用http://blogs.msdn.com/b/vstsqualitytools/archive/2009/09/04/extending-the-visual-studio-unit-test-type-part-1.aspx 中描述的方法通过自定义测试属性来执行此操作。但是,我没有对此进行测试,并且我不确定测试方法调用机制是否允许应用 PermitOnly 以导致它出现在测试代码的调用堆栈中。

如果您有很多这些要编写和使用自定义 ITestMethodInvoker 要么不起作用或不合适,另一种选择是使用像 PostSharp 这样的后编译器来插入 PermitOnly 调用。

如果这些都不适合,并且您没有与 MSTest 结婚,您可能还需要考虑将测试框架更改为更易于扩展的框架。

【讨论】:

  • 非常感谢您的全面回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多