【问题标题】:Utilizing Resources during unit tests [closed]在单元测试期间利用资源[关闭]
【发布时间】:2013-10-14 11:37:27
【问题描述】:

我是使用 VS2010 和 C# 进行单元测试的新手。我正在尝试加载应该测试的文件。有类似行家的方法吗?或者什么是最佳做法?

我应该如何存储和加载我的测试资源?

我的方法是在测试项目中创建一个新文件夹,例如

+MyTestProject
+-Properties
+-....
+-Resources
 +- MyFile.xml
 +- OtherFile.xls
 +-...
+...

// 编辑:

我正在尝试针对生成的内容测试我的代码,因此我正在寻找一种可能性,可以将这些内容原样加载到我的单元测试框架 [ClassInitialize()] 中,并为每个单元测试 [TestInitialize()] 传递它们。所以我真的很想将文件加载到磁盘上。 Mocking 也是一个很好的提示,但对于这种情况,我更喜欢另一种方式。

【问题讨论】:

  • 也许您可以创建一个 xml 对象而不是使用 xml 文件 - 但如果没有更多信息,您的方法似乎很好
  • “我正在尝试针对生成的内容测试我的代码” - 此内容必须具有您可以测试的内存表示。你不能从代码中重新创建它而不是读取文件吗?
  • @CodeCaster 不是我,它是从其他应用程序生成此内容的,我无法直接访问它。只有结果。

标签: c# visual-studio-2010 unit-testing


【解决方案1】:

您尝试在 UnitTesting 项目中使用什么样的资源?如果您要在单元测试中使用依赖项,那么它不是单元测试。

单元测试倾向于只测试一个独立的代码单元。如果你有依赖,那么你可以使用 Mock 框架来伪造那些依赖资源。

如果您正在寻找集成测试,那就另当别论了。在这种情况下,您必须使用生产分支中的“文件作为链接”,而不是使用文件副本。

【讨论】:

  • 谢谢 - 我已经编辑了我的问题。我无法链接它,我不得不为每个输入文件的每个版本调整它的代码。
  • 我会说如果生成了文件,那么调用生成文件的操作(在 Class\Test Initialized 中)并在 bin 或 output 文件夹中找到生成的文件。如果未生成文件,测试将失败。这将使依赖性保持在最低水平并提供更多的测试范围。不确定这是否适合您的情况。
【解决方案2】:

您可以使用多种方法。一种是将文件部署为嵌入式资源,并在测试运行时以夹具/测试类初始化方法提取它们。这种方法非常可靠(即,在哪里运行测试程序集无关紧要),但稍微复杂一些(您需要将文件标记为嵌入资源,您需要了解嵌入文件时使用的命名约定-基于资源的程序集,您需要熟悉 Assembly.GetManifestResourceStream())。

或者,您可以使用“松散文件”(即不嵌入)。在这种方法中,您只需将文件标记为“始终复制”或“如果更新则复制” - 这将导致文件被复制到测试程序集的构建输出目录中。如果您使用的是 NUnit,您可以停在那里。如果您使用的是 MSTest(Visual Studio 自带的),您需要将 [DeploymentItem] 属性添加到您的测试类或方法中:

  [DeploymentItem("MyFile.xml"[, "someoptionalsubfolder"])]
  public void MyTest()
  {
      ...
  }

在上述两种情况下,我建议您对资源采用文件夹结构/命名约定,以帮助您跟踪它们。像下面这样的东西对我来说效果很好。它取自 ASP.NET MVC 使用的文件夹结构,并且运行良好。在这种方法中,您可以拥有“共享”资源(即,对于程序集或测试类级别的一组测试来说是恒定的),但每组测试甚至每个测试都可能有自己特定版本的资源(例如,用于测试“无效数据”响应或测试极端情况):

  +-Resources
    +-Shared
      - SomeGlobalResource.xml
    +-TestClass1
      +-Shared
        - MockData.xml
      +-TestCase1
        - SpecialVersionofMockData.xml
      +-TestCase2
        - MockDataMissingRequiredInformation.xml
      +-TestCase3
        - EtCetera.xml
      +-...
    +-TestClass2
      +-Shared
      +-TestCase1
      +-TestCase2
      +-...
    +-TestClass3
    ...

顺便说一句,如果您采用这种方法,这将大大简化您在 MSTest 下使用 DeploymentItem 属性的方式。无需让自己发疯并为每个资源文件维护一个属性,您只需在类中放置一个复制整个资源文件夹树的指令:

  [DeploymentItem("Resources\\", "Resources")]
  [TestClass]
  public class MyTestClass()
  {
      ...
  }

编辑:我应该指出,您仍然需要管理测试内容的路径 - NUnit 和 MSTest 都没有提供工具来根据当前执行的测试自动生成路径。这意味着在复制粘贴任何测试代码时,您必须注意保持正确的路径。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-16
    • 2014-08-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多