【问题标题】:Identifying 'effective' unit tests for a service facade识别服务外观的“有效”单元测试
【发布时间】:2011-11-11 16:39:09
【问题描述】:

鉴于以下(基本)服务外观类,我想要一些关于哪些单元测试应该和值得编写的建议和指导。我正在使用 MEF 进行依赖注入,并使用 AutoMapper 将我的数据合约映射到域对象,反之亦然。

public sealed class MyServiceFacade
{
    [ImportingConstructor()]
    public MyServiceFacade(IDependency dependency,
                           IMappingEngine mappingEngine)
    {
        if (dependency == null)
            throw new ArgumentNullException("dependency");

        if (mappingEngine == null)
            throw new ArgumentNullException("mappingEngine");

        Dependency = dependency;
        MappingEngine = mappingEngine;
    }

    public IDependency Dependency { get; private set; }
    public IMappingEngine MappingEngine { get; private set; }

    public ResponseContract TheMethod(RequestContract requestContract)
    {
        // Verify parameters
        if (requestContract == null)
            throw new ArgumentNullException(requestContract);

        // Translate parameter values
        var request = MappingEngine.DynamicMap<Request>(requestContract);

        // Delegate to the domain layer
        var response = Dependency.DoSomethingWith(request);

        // Translate the response
        var responseContract = MappingEngine.DynamicMap<ResponseContract>(response);

        // Return the response
        return responseContract;
    }
}

我希望看到良好的代码覆盖率,但不想编写无用/无效的测试。

(有关有效集成测试的建议也会有所帮助。)

你的想法?

更新

基于有限的回应,我想我会继续通过描述我认为的“最坏情况”情景来进一步引导对话(我最初试图避免的事情)。

我团队中的一位开发人员大力提倡使用尽可能多的代码覆盖率进行“白盒”单元测试。由于他的方法,我们将进行以下测试:

  1. 构造对象时,如果'dependency'属性为null,则抛出ArgumentNullException。
  2. 构造对象时,如果“mappingEngine”属性为null,则抛出ArgumentNullException。
  3. 构造对象时,如果两个参数都不为null,则不会抛出ArgumentNullException。
  4. 对象构造完成后,Dependency属性将'dependency'参数中传入的对象返回给构造函数。
  5. 对象构造完成后,MappingEngine属性将'mappingEngine'参数中传入的对象返回给构造函数。
  6. 调用 TheMethod 时,如果 'requestContract' 属性为 null,则会引发 ArgumentNullException。
  7. 调用 TheMethod 时,如果“requestContract”属性不为 null,则不会引发 ArgumentNullException。
  8. 当调用 TheMethod 时,模拟的 IMappingEngine 的 DynamicMap() 方法只调用一次,并将 RequestContract 传递给 TheMethod。
  9. 调用 TheMethod 时,仅调用一次模拟 IDependency 的 DoSomethingWith() 方法,并使用从模拟 IMappingEngine 返回的 Request 对象。
  10. 调用 TheMethod 时,仅调用一次模拟 IMappingEngine 的 DynamicMap() 方法,并从模拟的 IDependency 返回 Response 对象。
  11. 调用 TheMethod 时,返回从模拟的 IMappingEngine 返回的 ResponseContract 对象。

如您所见,这会导致大量测试实际上是在测试实现,但并未反映更高级别的需求(另一种方法)。

这是您进行测试的方式还是会走不同的路线?

【问题讨论】:

  • 你的问题比较模糊。你能说得更具体一点吗?

标签: unit-testing testing integration-testing


【解决方案1】:

我想要一些关于哪些单元测试应该和值得编写的建议和指导

我使用equivalence partitioning 来建议一组提供良好覆盖率的基本测试。

【讨论】:

  • 测试中的等价分区有一些缺点。它没有正确检查边界条件。我个人不是使用这样的技术,而是用我的大脑来决定需要多少单元测试以及它们应该涵盖什么:)
  • @Guillaume,因为这已经是漫长的一周,我选择不将您的评论视为侮辱,并要求你们提供更多切实的细节。虽然我想了解该方法背后的思考过程,但我并不是在寻找计算机科学课程并将代码示例放在原始帖子中,以便有一些具体的东西作为响应的基础。
  • 这是我组织中的一个典型用例,在应该和应该测试什么方面引起了很多讨论和意见分歧。我的帖子的目的是向广大受众开放,以了解整个社区对此主题的看法。
  • 抱歉,我意识到这听起来很刺耳,这根本不是我的本意(英语不是我的自然语言),所以如果这听起来像是一种侮辱,我真的很抱歉,我知道这是一个公开的讨论,我只是想说我没有遵循任何特定的哲学来决定要编写什么测试。再次道歉:(
  • @Guillaume:等价分区是“使用你的大脑”的 2 天。但它不仅仅是随机选择测试用例,它是一种更系统的方法来选择“值得编写”的测试用例。
猜你喜欢
  • 2015-04-09
  • 1970-01-01
  • 2021-10-27
  • 1970-01-01
  • 2011-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多