是否有必要为 n 层架构上的每一层编写单元测试代码?

Is it necessary to code unit tests for every single layer on an n-tier architecture?

我是单元测试的新手,所以我一直在尝试编写一些示例以学习正确的使用方法。我有一个使用 Entity Framework 连接到数据库的示例项目。

我正在使用一个 n 层架构,该架构由使用 EF 查询数据库的数据访问层、调用数据访问层方法来查询数据库并使用检索到的数据执行其业务目的的业务层组成由简单调用业务层对象的 WCF 服务组成的服务层。

我是否必须为每一层(数据访问、业务层、服务层)编写单元测试代码?

为查询数据库的方法编写单元测试代码的正确方法是什么?下一个代码是我的数据访问层中的一个方法示例,它在数据库上执行 select,它的单元测试应该如何?

public class DLEmployee
{

    private string _strErrorMessage = string.Empty;
    private bool _blnResult = true;

    public string strErrorMessage
    {
        get
        {
            return _strErrorMessage;
        }
    }
    public bool blnResult
    {
        get
        {
            return _blnResult;
        }
    }

    public Employee GetEmployee(int pintId)
    {
        Employee employee = null;
        _blnResult = true;
        _strErrorMessage = string.Empty;

        try
        {
            using (var context = new AdventureWorks2012Entities())
            {
                employee = context.Employees.Where(e => e.BusinessEntityID == pintId).FirstOrDefault();
            }
        }
        catch (Exception ex)
        {
            _strErrorMessage = ex.Message;
            _blnResult = false;

        }

        return employee;
    }

这是我基于领域驱动设计原则的 2 美分:

  • 你的业务层不应该依赖于具体的数据层,它应该只是定义一些数据层可以实现的抽象接口(存储库)。
  • 你绝对应该 unit-test 你的业务层有一个不接触文件系统的假数据层。
  • 您可以创建 集成测试 ,包括您的服务 具有假数据层的业务层。模拟业务层并检查服务层 在业务层上调用 是没有意义的(行为测试),而是检查它对可观察到的业务对象所做的状态更改业务层。
  • 您应该使用真实的数据层、服务和业务层创建一些端到端测试,并在服务层上练习一些用例。

如果您刚开始进行单元测试,我建议您阅读 Kent Beck 的 Test Driven Development by Example and Gerard Meszaros' xUnit Test Patterns

我不得不说是的,有必要对每一层进行单元测试。这样做会提供更好的覆盖范围。它的维护部分可能具有挑战性,因为您最终会得到很多单元测试用例,但是当有人试图破坏一些非常重要的逻辑时,它确实有助于避免巨大的陷阱。最好使用 Jenkins 等持续集成工具自动对所有层进行单元测试。

关于您在数据库层进行单元测试的示例,请保持简单,并根据所需字段、单元格数据大小等元数据进行断言