3层API中的单元,集成,功能测试

时间:2020-07-19 17:54:10

标签: unit-testing express testing automated-tests

我正在使用Express / Sequelize使用3层体系结构来开发API应用程序,并且我想弄清楚测试每个层的位置。我已经阅读了很多关于每种测试类型(单元,集成,功能)的概念和定义,对我来说很明显,这些概念并不是每个人都同意的。

这是我的API架构: 3 Layer architecture

这是我要遵循的测试金字塔: Test pyramid

在控制器层中,我具有路由,而且我几乎可以确定在功能测试中测试了该层,在该测试中测试将真正使用API​​,并检查返回状态和主体。

我不确定其他测试层。 在服务层中,我拥有将与我的模型进行交互的所有业务逻辑和代码,例如一些伪代码:

static async createUserWithDefaultPermissions(attributes: Object) {
    const user = await User.create(attributes);
    defaultPermissions = ['login', 'list-users', 'change-password]; // initial permissions
    defaultPermissions.forEach(permissions) {
        // save UserPermission relation
    }

    return user;
}

目前,这非常简单,但是这里我将介绍所有业务逻辑。在我看来,这将在集成测试中进行测试,因为它取决于数据库。

最后,在数据访问层中,我有序列化定义的模型及其验证。我认为应该在这里进行单元测试。

我认为正确或完全迷失了吗?

除了要测试每个层之外,我也不知道要测试什么。现在,我认为在单元测试中,我应该测试所有模型验证规则,而无需接触数据库。例如,假设我的用户模型只有两个字段:

  • 登录:不为空
  • 密码:不为null,至少5个字符

我将运行3个测试:

    1. 检查登录为空时验证是否失败
    1. 检查密码为空时验证是否失败
    1. 检查密码太短时验证是否失败

假设这是对的,我在集成测试中正在执行以下操作:

const user = await UserService.createUserWithDefaultPermissions({fakeUserAttributes});
const databaseUser = User.findByPk(user.id);

// if databaUser was found test pass

对吗?还是应该再次测试所有验证,例如尝试创建具有空登录名,空通行证等的用户?

在此事上希望获得一些指导

0 个答案:

没有答案