【问题标题】:Should Unit Tests be in their own project in a .Net Solution单元测试是否应该在 .Net 解决方案中的自己的项目中
【发布时间】:2010-02-12 10:04:54
【问题描述】:

我应该为我的单元测试开始一个新项目吗?这意味着我会得到两个正确的可执行文件?然后我担心命名空间组织。尽管它们是不同项目的一部分,但我能否将单元测试放在与它们正在测试的类相同的命名空间中?

这引发了另一个问题。我知道命名空间命名约定是 CompanyName.TechnologyName.Feautre.Design。我如何在我的解决方案/项目布局中做到这一点?解决方案名称=公司名称,项目名称=技术名称吗?

如果是这样,那是否意味着我不能将我的单元测试分离到一个新项目中。

【问题讨论】:

    标签: .net unit-testing project-structure


    【解决方案1】:

    最好的方法是为每个“生产项目”设置一个单独的单元测试项目。这样可以确保您可以成对地改变和移动它们。

    如果您有一个单元测试项目覆盖多个目标项目,这会在这两个项目之间产生一种人为的紧密耦合,因为如果没有所有这些,您将无法编译单元测试项目其目标项目。这再次使得单独测试单个项目变得非常困难——这就是单元测试的全部意义所在。

    将单元测试保存在单独的库中非常重要,因为这样可以确保您只测试代码的公共 API(黑盒测试)。

    我通过在目标命名空间后附加“UnitTest”来命名我的命名空间。

    【讨论】:

    • 一堆项目拖慢了一切。反对 1project 4 解决方案的任何论据?
    • @Arnis L.:每个解决方案 1 个单元测试项目会在解决方案和目标项目之间建立人为的紧密耦合。想象一下,您想在不同的解决方案中重用您的项目之一,但您仍然希望在该新解决方案中对该项目进行单元测试覆盖。这是不可能的,因为单个单元测试项目结合了多个项目。我一直在那里受苦受难,我再也不想这样做了。
    • @Arnis L.:这不是我要说的。假设您的解决方案包含 LibraryA 和 LibraryB(都是生产代码)。如果您只有一个同时针对 LibraryA 和 LibraryB 的单元测试项目,则需要从单元测试项目中同时引用 LibraryA 和 LibraryB。现在,如果您想在新解决方案中重用 LibraryA(但不是 LibraryB)及其单元测试,则不能,因为如果 LibraryB 也不存在,单元测试将无法编译。
    • @Arnis L.:如果您必须在您的解决方案中有数百个项目,那么您就有了紧密耦合的代码。您的问题不在于您是否还有 1 个或 x 个单元测试项目 - 您的问题是紧耦合。在这种情况下,将自己限制在一个单元测试项目中只是治标。更好的解决方案是解决根本问题。
    • @Arnis L.:我相信关于不需要在其他地方重用应用程序的部分的论点是一个自我实现的预言,因为它会导致你实现它,以至于这确实是不可能的,即使它后来变得可取。但是,如果您要隔离域模型,则很可能会再次使用该部分 - 例如作为一种 Web 服务,为原始应用程序提供可自动化的接口。
    【解决方案2】:

    我倾向于有一个特定的测试项目/程序集每个程序集。测试程序集将与它应该测试的程序集同名,并在名称和命名空间中添加.Test

    这样,您就可以隔离测试,并且不会将它们与您的生产代码一起部署。

    【讨论】:

      【解决方案3】:

      每个解决方案 1 个带有文件夹的测试项目 => 回归/集成/单元,其中包含“镜像”您的解决方案项目/文件夹架构的子文件夹。

      请记住 - 测试不是您的生产代码。他们应该分开。

      【讨论】:

      • 有趣的是,我知道一家公司在他们的应用程序中提供测试。事实上,它们可以从应用程序中运行。对集成测试更有意义,我想...
      • @Mitch Wheat 别误会我的意思。也可以运送它们(第 3 方工具一直这样做(例如 nunit 本身)),但它们应该在逻辑上和物理上(程序集、java 包、whateva)分开。这只是我的看法。 :)
      • 当然。并不是暗示他们不应该分开。
      【解决方案4】:

      是的。您的单元测试应该是一个单独的项目,它会编译成自己的 DLL。

      这意味着您不会将测试代码与您的项目一起部署 - 它会鼓励良好的设计(因为您的测试看不到私有/内部属性,您自然会倾向于测试项目中与其他系统,而不是专注于测试其内部实现的每个细节)

      在命名方面,我们通常为每个项目选择一个“代号”——当前项目名为 Zanzibar——然后最终得到如下项目:

      MyCompany.Zanzibar.Website(ASP.NET MVC Web 应用程序)

      MyCompany.Zanzibar.Website.Testing(包含 MVC Web 应用的单元测试)

      【讨论】:

        【解决方案5】:

        是的。为每个解决方案项目创建一个单元测试项目。

        只有一个可执行文件。单元测试保存在 DLL 中。

        为什么不将“UnitTests”附加到相关的命名空间。

        【讨论】:

        • 我一直在使用访问修饰符,因为我不想暴露我的类的内部结构。但我确实想对它们进行单元测试,所以我将它们设为私有(对不起,我来自 Java 背景)。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-27
        • 2017-06-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多