有效单元测试范围以及应该实际测试什么?

问题描述

|| 我看到有一些基于该主题的问题,但是我有一些具体的示例正在努力解决。我希望有人能在这里为我提供帮助,因为我是测试驱动开发和单元测试的新手。 (我不确定是否重要,但是我正在将C#与.NET Framework 4.0配合使用,并使用Microsoft的内置测试框架) 首先,值得测试非常简单的代码块吗?例如,对于我的一个类,我有一个Fill方法,该方法接受10个参数,并根据这些参数为该类中的10个属性设置值。填充代码实际上只是一系列值设置语句。我已经读到一个好的单元测试应该只声明一件事,但是在我看来,要检查所有这些值是否已正确设置,我必须声明十件事。因此,要么我根本无法测试它,要么相信代码足够简单,要么编写10个不同的单元测试来检查每个属性。这些正确吗? 第二个例子。我有一段代码,可以多次调用类的私有方法,最后调用Web服务向用户发送电子邮件。我知道我应该为电子邮件服务注入一个模拟Web服务,这样我就不会测试多个类,但是我应该如何测试所有这些私有方法和电子邮件调用已经完成? 第三个示例与上一个相似。我的课程结构看起来像: 控制器---取决于---> IWidget(某些业务对象)&& IDataProvider DataProvider(Implements IDataProvider)---取决于---> WebService WebService-直接拨打电话->数据库 现在,我已经对该控制器进行了单元测试(注入了模拟Widget和DataProviders)。 这样就很好。我也有没有问题的Widget单元测试。 问题归结于DataProvider和WebService。在此特定实例中,WebService只会执行数据提供程序的请求,然后再传递数据(由于物理体系结构的限制),什么也不做。 我无法对DataProvider进行单元测试,因为我不确定如何注入模拟Web服务。我也不确定对DataProvider进行单元测试是否值得,因为我最终不得不在很多模拟数据集中编写代码以测试值。同样,我不确定如何对Web服务进行单元测试,因为在这种情况下,WebService的主要功能取决于数据库。再一次,这值得测试吗?如果WebService除了充当传递但仍依赖于数据库又做些什么呢? 非常感谢任何人在这方面可以提供的任何建议。非常感谢。     

解决方法

我已经读到一个好的单元测试应该只声明一件事,但是在我看来,要检查所有这些值是否已正确设置,我必须声明十件事。因此,要么我根本无法测试它,要么相信代码足够简单,要么编写10个不同的单元测试来检查每个属性。 我想说一个好的单元测试应该测试一个故事或用例场景,而这实际上可能涉及多个断言。 如果该方法涉及10个分配,则确实有可能将某些分配弄乱,名称拼写错误等,因此,单元测试为其(小)价格提供了价值。   我有一段代码,可以多次调用类的私有方法,最后调用Web服务向用户发送电子邮件。我知道我应该为电子邮件服务注入一个模拟Web服务,这样我就不会测试多个类,但是我应该如何测试所有这些私有方法和电子邮件调用已经完成? 这称为感应,即感应所拨打电话的结果/副作用。答案取决于这些私有方法的实际作用。如果他们组合了一些数据,这些数据最终进入了邮件消息,则可以通过消息内容对其进行测试。如果它们以可以从外部检测到的方式更改了对象的内部状态,则可以对其进行验证。如果所有这些都不成立,那么甚至最好将这些私有方法移到单独的类的公共接口中,在此可以对它们进行适当的单元测试。   我无法对DataProvider进行单元测试,因为我不确定如何注入模拟Web服务。我也不确定对DataProvider进行单元测试是否值得,因为我最终不得不在很多模拟数据集中编写代码以测试值。 我不一定要对这样的类进行单元测试,这些类实际上是外部组件的包装。如果那里的逻辑数量绝对最小,即所有(或最可能的)值得测试的代码都移到了其他可单元测试的类中,IMO,可以将这些类的测试留给集成/功能测试,测试连接到真实数据库,Web服务等的整个(子系统)。     ,广告优先) 您可能会争辩说,如果仅执行设置语句,那么您实际上并没有提供任何功能。但是,如果您有一个负责代码覆盖范围工作的老板,那么不测试这种方法会给您带来麻烦。是的,您只应声明一件事,但是对每个属性的IMHO声明是由一种方法正确设置的,那么它仅被视为一个声明-无论测试方法中有多少个声明语句。有时我什至将所有断言提取到私有方法中以说明这一点 广告第二) 如果您需要测试私有方法,则表明最好提取那些私有方法。 广告第三) 我通过将所有webservice调用包装在网关类中来避免此问题。该网关的接口可以被模拟和注入。如果可能,我会尝试通过所有外部通信进行此操作。 更新: 糟糕...弄乱了编号。立即修复