发布于 2026-01-06 1 阅读
0

Jasmine 测试教程

Jasmine 测试教程

在Web开发中,测试的重要性日益凸显,尤其是在DevOps蓬勃发展的今天。随着持续集成和部署成为标准实践,保持源代码的整洁至关重要,确保任何异常代码都不会进入生产环境或其他任何环境。自动化测试是实现这一目标的一种方法,但您仍然需要编写这些测试用例。

本教程将简要介绍测试驱动开发 (TDD) 和行为驱动开发 (BDD) 在敏捷环境中的工作原理,以及如何在 Jasmine 中编写单元测试。我们将演示如何使用 TDD 和 BDD 编写几个单元测试,并解释我们这样做的原因以及我们做出这些决策的过程。

TDD 和 BDD 的背景知识

我们先来简单了解一下TDD和BDD。您可以点击这里查看更深入但又简明的概述:TDD/BDD概述。简而言之,BDD描述了功能如何运作以及用户应该如何使用它们,而TDD则要求您在编写代码之前先为这些功能编写测试。将这两种方法结合起来使用将为您带来诸多优势。

  • 您的团队将了解功能需求的来源及其必要性。

  • 您的项目将拥有广泛的测试覆盖率,从而能够更快地编写出更高质量的代码。

  • 代码的任何部分都不会出现文档问题,因为任何开发人员都可以查看测试用例来了解代码应该如何运行。

  • 在编写代码之前编写测试可以让你更好地理解你试图解决的问题。

  • 为代码编写测试可以使你的 CI/CD 流水线更加可靠和一致。

以上只是编写测试的一些优势。接下来,我将演示如何使用 Jasmine.js 编写两个测试。同样的方法也适用于使用任何前端或后端库编写测试。

用户故事

我们将使用以下两个用户故事来编写测试。

用户故事 1

作为管理员用户,我可以停用所有具有我所选权限的用户,这样我就可以同时从系统中删除多个具有相同权限的用户,而不是逐个删除。

用户故事 2

作为账户用户,我可以启用或禁用双重身份验证,从而决定我希望我的账户信息受到多大程度的安全保护。

这些功能虽然不是什么花哨的功能,但每个功能都包含若干任务。通常下一步是和团队开会,把这些用户故事拆分成具体的任务,然后编写相应的代码。我们来简单介绍一下。为了简洁起见,我们可能会省略一些内容或进行一些精简。

用户故事 1 任务

  • 请确保用户是管理员。
  • 根据权限选择筛选所有用户
  • 增加以组为单位删除用户的功能。

用户故事 2 任务

  • 创建一个新的模态框来更新双因素认证设置
  • 如果他们不启用双因素身份验证,则添加有关信息安全的警告。

这是从这些用户故事中提取出来的任务的粗略分解。现在我们已经定义了任务,可以开始编写测试了。

在 Jasmine 中编写测试

在本快速教程中,我们将使用 Jasmine.js。它非常容易上手,并且与大多数 JavaScript 框架都能很好地集成。我喜欢用它来测试 Angular 应用程序。如果您想了解 Jasmine 的详细信息以及如何使用它,请查看其文档:https://jasmine.github.io/api/edge/global。我们不会为所有任务编写测试,因为那样会给您留下一些练习题。我们将编写三个测试,以便您更好地理解如何编写测试。请记住,我们目前还没有任何代码实现,所以您可以随意命名。

请确保用户是管理员。

'use strict';

const testAdminUser = require('./adminUser.js');

describe('make sure user is an admin', () => {
    let dummyUser = {
        username: 'testdummy',
        password: 't3StD4mM7'
    };

    it('check if user is logged in', () => {
        expect(testAdminUser.login(dummyUser).response.success).toBe(true); 
    });

    it('check if user has admin permissions', () => {
        let userPermissions = [];
        userPermissions = testAdminUser.login(dummyUser).response.permissions;

        expect(userPermissions.includes('Administrator')).toBe(true);
    });
});
Enter fullscreen mode Exit fullscreen mode

增加以组为单位删除用户的功能。

'use strict';

const testAdminUser = require('./adminUser.js');

describe('functionality to remove users as a group', () => {
    let dummyPermission = 'Contributor';

    it('gets a list of all users marked for deletion', () => {
        expect(testAdminUser.getUsersForDeletion(dummyPermission).response).toBeDefined(); 
    });

    it('remove all users with the targeted permissions', () => {        
        expect(testAdminUser.deleteUsers(dummyUser).response.success).toBe(true);
    });

    it('check that the users have actually been removed', () => {
        let listOfUsers = testAdminUser.getUsersForDeletion(dummyPermission).response;

        expect(listOfUsers.length).toBeLessThan(1);
    });
});
Enter fullscreen mode Exit fullscreen mode

创建一个新的模态框来更新双因素认证设置

'use strict';

const testAdminUser = require('./adminUser.js');

describe('make a new modal to update two factor settings', () => {
    let dummyUser = {
        username: 'testdummy',
        password: 't3StD4mM7'
    };

    it('check if new modal has been created', () => {
        expect('#two-factor-modal').toExist();
    });

    it('check that two factor settings have loaded with the selected value', () => {        
        expect(testAdminUser.getTwoFactorSettings(dummyUser).response).not.toBeNull();
    });

    it('check that changing the two factor setting updates the value for the user', () => {
        let selectedValue = false;
        let isUpdateSuccessful = testAdminUser.updateTwoFactorSettings(dummyUser).response.success;

        if (isUpdateSuccessful) {
            expect(testAdminUser.getTwoFactorSettings(dummyUser).response).toBe(selectedValue);
        }
    });
});
Enter fullscreen mode Exit fullscreen mode

这些是一些使用 Jasmine 编写测试的示例,但大多数测试库都遵循类似的流程。你需要描述要测试的内容,然后编写一些虚拟条件来对你计划实现的代码执行这些测试。当然,这并非编写这些任务测试的唯一方法,所以如果你觉得还有改进的空间,那就自己编写测试吧!毕竟,这才是你获得最大收益的方式。

编写测试并不难,只是需要时间去适应。通常情况下,拿到任务后会直接开始编写代码,所以先编写测试会显得很复杂。很多开发者会立刻问:如何为一段尚未存在的代码编写测试?这种想法是错误的。编写测试的目的并非仅仅是为了检查代码的实现,而是为了验证某个功能是否按照业务需求运行。

这就是为什么你可以在编写代码之前先编写测试。一旦测试写好,你就有了代码的框架。然后,你编写代码来通过功能测试。之后,你重构代码以提高效率。这就是 TDD/BDD 的工作原理,当你掌握了它之后,你会发现它非常棒。

你觉得为什么开发者在是否编写测试这个问题上存在如此大的分歧?我知道有些人从事软件开发超过20年,却从未编写过测试,而有些人则认为没有测试就写不出代码是不可想象的。为什么会有如此大的分歧?是因为测试这门学科相对较新,还是因为商业运作方式或其他原因?我真的很好奇!


嘿!你应该在推特上关注我,原因你懂的:https://twitter.com/FlippedCoding

文章来源:https://dev.to/flippedcoding/jasmine-testing-tutorial-2nmk