【问题标题】:at what point does a unit test become an integration test?单元测试在什么时候成为集成测试?
【发布时间】:2016-06-16 21:48:39
【问题描述】:

单元测试涉及测试应用程序的最小单元。因此,可以针对 UserRepository 编写单元测试来测试 GetAllUsers() 方法。

也可以针对 UserDomain 编写单元测试来测试 GetAllUsers() 方法。由于 UserDomain 调用到 UserRepository 将 UserDomain 测试视为集成测试吗?

如果有一个服务层将 API 提供到后端,那么 UserDomain 测试是否会被视为单元测试?

【问题讨论】:

  • 如果涉及两个或更多单元,则为集成测试。
  • 根据您的经验,很多开发人员会在 Domain 层创建单元测试,在 Service 层创建集成测试吗?由于收益递减,他们基本上跳过了回购层的单元测试?
  • 专注于对代码中的逻辑进行单元测试;数据访问层可能足够精简,只能通过集成测试来实现

标签: unit-testing integration-testing


【解决方案1】:

如果您正在测试依赖于UserRepositoryUserDomain,那么您不是在对接口进行编码,而是对具体/实现进行编码。这反过来又将两者结合在一起。耦合代码意味着难以对代码进行单元测试,因为没有UserRepository 就没有测试UserDomain

在你的例子中,你可能有这样的东西:

public class UserDomain
{
    public object GetAllUsers()
    {
        UserRepository repo = new UserRepository();
        var results = repo.GetAllUsers();
        // do some stuff like transforming it
        return null;
    }
}

public class UserRepository
{
    public object GetAllUsers()
    {
        return null; // implementation
    }
}

用这种方法编码的问题是你不能真正“单元测试”UserDomain,因为它依赖于UserRepository。为了完成真正的单元测试,您的作品必须不依赖于实现,而是依赖于接口之类的抽象。

要完成单元测试,您的类可以看起来更像:

public class UserDomain
{
    private readonly IUserRepository _iUserRepository;

    public UserDomain(IUserRepository iUserRepository)
    {
        _iUserRepository = iUserRepository;
    }

    public object GetAllUsers()
    {
        var results = _iUserRepository.GetAllUsers();
        // do some stuff like transforming it
        return null;
    }
}

public interface IUserRepository
{
    object GetAllUsers();
}

public class UserRepository : IUserRepository
{
    public object GetAllUsers()
    {
        return null;
    }
}

请注意,一旦您了解了您所看到的内容,这里并没有真正改变很多。我们创建了一个新接口IUserRepositoryUserRepository 现在实现了它。 UserDomain 也被更新为而不是新的特定实现 (UserRepository),采用 IUserRepository 的实例。

这意味着一些事情,UserDomain 不再直接依赖于 UserRepository,它现在依赖于抽象 IUserRepository,它可以很容易地被模拟、存根或伪造,以便为测试目的。

在构造函数中传入接口实现的概念称为dependency injection。构造函数注入是完成依赖注入的一种方法,但也有其他方法。它的基本思想是,如果一个类有依赖关系,这些依赖关系应该在接口/合同上,而不是文字实现上。

综上所述,集成测试是在UserDomain 范围内使用UserRepository 等实际实现的测试,而不是您的存根、模拟、伪造IUserRepository

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-05
    • 1970-01-01
    相关资源
    最近更新 更多