保持您的源关闭和您的unit testing更紧密

当我第一次开始使用unit testing时遇到了两个问题。 首先是能够测试私人方法和领域,然后在快速开发发生时保持unit testing的最新状态。 因此,我采用了以下方法进行unit testing。

#if UNITTEST using NUnit.Framework; #endif public class MyBlackMagic { private int DoMagic() { return 1; } #if UNITTEST [TestFixture] public class MyBlackMagicUnitTest { [TestFixtureSetUp] public void Init() { log4net.Config.BasicConfigurator.Configure(); } [Test] public void DoMagicTest() { Console.WriteLine(System.Reflection.MethodBase.GetCurrentMethod().Name); Assert.IsTrue(DoMagic() == 1, "You are not a real magician!"); } } #endif } 

我发现这种方法克服了我的两个问题,它是一个预编译器开关的轻弹,以确保所有unit testing编译。

我现在的问题是,我正在转向一个新项目,其中的讨论是使用单独的程序集来进行unit testing。 在我深入研究如上所示的内部阶级方法的优点之前,我想知道是否有人认为它有任何缺点?

编辑:

只是为了解决一些提到的弱点:

  • 由于UNITTEST预编译器标志被关闭,unit testing代码永远不会影响生产代码,
  • unit testing代码不会使主代码的可读性降低,因为它放在每个类的底部并包装在Visual Studio区域指令中,
  • 我发现内部unit testing类意味着主类实际上更简单,因为没有额外的方法或属性只是为了测试而暴露。 总会有这样的情况,你想早晚测试一个类的内部状态作为unit testing的一部分……

我发现这种方法非常难看,因为它会使用测试方法使您的真实逻辑变得混乱,从而使您的源更难以阅读。

接下来,您还可以在项目本身中对NUnit程序集进行依赖(引用)。 虽然在没有unit_test条件定义的情况下编译时不需要依赖,但这很简单且不必要。

如果你想跟上你的unit testing,我建议你先编写测试,然后实现真正的代码。

编写unit testing更多的是测试; 它也是关于设计代码。

通过首先编写测试,您将会想到您的类的API /接口,或者您希望如何使用这些类。

您不应该单独测试私有方法,因为它们(应该是!)从公共方法或可能的构造函数中使用 – 因此公共方法依赖于私有方法来成功完成它们的分配。

如果私有方法不起作用,这些公共方法/构造函数将(应该!)失败。 所以你的方法实际上是编写unit testing的坏方法。

并迭代以前的答案 – 在编写方法之前编写unit testing。

如果你不能一直保持所有的测试成功(因为开发截止日期),那么我认为你的unit testing非常严重,你应该在做出估算时考虑维护测试。

我发现在我们自己的assembly中保持我的unit testing非常有效,并且没有遇到任何使用它的问题。

但是,如果您发现自己需要测试某些类的私有成员,那可能意味着您的课程正在做很多事情。 您可能最好将这些私有成员提取到一个新类中。 然后,您可以通过其公共方法直接测试该新类。

我认为这不是unit testing的设计目标。 如果您已快速开发代码并且unit testing落后,那么它们当然会失败,但这不应该导致您使用黑魔法,而是编写unit testing。 如果您不喜欢这种方式,那么您根本不应该使用unit testing。

将测试代码保存在自己的单独程序集中的基本原理是因为测试代码不应被用户“使用”。 unit testing仅用于validation代码是否按指定的方式执行。 通常的做法是将测试代码放在它自己的程序集中,这样生产代码就不依赖于测试代码和unit testing框架。

从这个代码示例中,我不清楚你要测试的是什么。 看起来你正试图测试一些与环境完全隔离的东西。 当xUnit测试运行器可以为您记录测试结果时,为什么还需要记录器?

内部类很难测试,因为你需要一个内部类正在实现的公共接口(或抽象类),你需要与创建它的类一起测试它。 更明确的unit testing应检查一个特定类的行为,如果以某种方式返回内部类,则需要检查它是否以正确的方式返回。

祈祷告诉你,如何在你将UNITTEST设置为false的任何构建中运行unit testing?

我是一个蹩脚,懒惰的TDD实现者。 我没有在足够的测试附近写任何东西,而且我不经常运行它们。 但即使我测试我的发布版本。