TDD - 你测试多少?

时间:2009-01-05 03:55:21

标签: c# .net unit-testing tdd

我正在开发一个新项目,我正在使用存储库模式,我有一个从数据库中提取数据的存储库和一个使用存储库并执行所有业务逻辑的“服务”类。

类似于以下内容;

public class UserRepository : IUserRepository
{
    public IQueryable<User> GetUsers()
    {
    // do stuff
    }
}

public class UserService 
{
    public IList<User> GetUserById
    {
        var rep = new UserRepository();
        var users = rep.GetUsers();
        // do business logic
        return users.ToList();
    }
}

您是否会测试UserService和UserRepository,或者您认为只测试服务就足够了吗?我认为,因为服务正在使用存储库,它应该很有趣,但它确实会破坏代码覆盖率。

8 个答案:

答案 0 :(得分:9)

你应该对它们进行测试,因为有一天可能会有UserRepository的其他客户端而不是UserService,并且这些客户端可能使用UserRepository而不是UserService。

答案 1 :(得分:8)

测试您需要的功能:

  • 某些功能可能位于一个类
  • 有些人可能居住在另一个班级
  • 有些人可能需要两个班级

从您的描述中看起来您可以定义这些功能,因此您可以非常合理地测试您喜欢的任何内容; - )

如果您正在寻找最低的TDD效率,只测试当前功能,然后继续代码覆盖与TDD无关;这是一个单位测试指标(可疑值)

[让downvoting开始吧! ; - )]

答案 2 :(得分:4)

如果您已编写代码并且现在只考虑测试,那么您已经偏离了测试驱动开发的真正路径:-)那就是说,如果是我的代码,我会写首先UserService测试,然后检查我的代码覆盖率。

编辑以回应评论:如果您还没有真正编写代码,我会首先编写UserService的测试,因为这是您应用的最终目标。然后当我编写代码以使UserService测试通过时,我会产生对存储库的测试。这些测试最终会成为存储库的规范,以防您以后再重复使用它。

答案 3 :(得分:1)

你应该测试它们。测试了存储库后,当您去测试服务时,它将更容易,更可靠。

答案 4 :(得分:1)

这里有两个选项:

  • 单元测试 - 在这种情况下,您可以单独测试每个组件,而无需访问服务,磁盘,数据库,活动目录等。这可以通过让您的测试充当驱动程序并剔除/模拟使用的类来实现。在你正在测试的课程上。

  • TDD - 这就像单元测试一样,但在这种情况下,你会编写你的测试用例,运行它失败,编写足够的代码让它通过,运行它以确认它通过,然后继续下一个。在这种情况下,应涵盖所有代码。

在您的情况下,非常重要的是要意识到在测试UserService时,您将针对实现IUserRepository的DummyRepository进行测试。在这种情况下,您可以完全测试用户服务,而无需访问真正的底层存储库类/数据源。这将明确区分两个类中的错误,并使您能够控制模拟存储库的所有可能失败。

您将执行相同的操作来测试UserRepository实现。这是通过删除对底层资源的访问。您可以使用Mock框架使用分析器API来模拟依赖项,或者使用接口/虚拟方法来允许单元测试类覆盖对资源的访问。

除了上述白盒测试技术外,您还需要进行黑盒/集成测试。这是您有一些端到端测试用例的地方,它们测试整个应用程序场景,其中UserService与UserRepository交互,然后UserRepository与数据源交互。

答案 5 :(得分:1)

如果您正在遵循TDD流程 - 正如问题标题所暗示的那样 - 那么如果没有经过测试,您将不会同时拥有UserRepository和UserService类。

有一个极限编程说:“测试可能破坏的所有内容”,所以你最好全部测试它们,以便你对代码有信心。

答案 6 :(得分:1)

正如其他人已经提到的,如果UserService就是您的应用程序的客户端将要看到的全部内容,我现在只测试它并使您的客户端无法访问UserRepository(例如将其设置为内部)。这样,即使不单独测试类,也应该获得良好的代码覆盖率。

如果您的代码覆盖率很差,这通常意味着您的测试不足或者您实现了无法通过公共接口调用的内容,因此可能会被删除。

答案 7 :(得分:1)

通过模拟存储库来测试服务单元测试以测试服务中的业务逻辑并测试不同的存储库方案,如异常,测试返回值等。一些模拟框架(如EasyMock)需要存储库接口,而其他像Mockito不需要。这样,您的服务测试将无法访问数据库,并且执行速度会更快。

编写存储库测试以测试所有数据库交互。使用DB单元数据集/夹具来测试数据,以确保正确实现DB逻辑。

另外,您可能希望在访问数据库的Service类上编写集成测试,而无需模拟存储库。