首页  >  文章  >  web前端  >  了解干净的代码:单元测试 ⚡

了解干净的代码:单元测试 ⚡

PHPz
PHPz原创
2024-08-29 14:00:431031浏览

Understanding Clean Code: Unit Tests ⚡

在软件开发中,单元测试是有助于确保代码正确性的重要实践。

《干净的代码:敏捷软件工艺手册》的第 9 章,标题为“单元测试”,深入探讨了编写干净且有效的单元测试的原则和实践。

在本文中,我们将总结本章的要点,并提供 JavaScript 示例来说明这些概念。


?为什么单元测试很重要

单元测试涉及为代码的各个单元或组件编写测试,以验证它们是否按预期运行。单元测试的主要目标是:

1- 尽早发现错误: 在开发过程中发现问题,然后再投入生产。

2- 促进重构: 确保对代码的更改不会破坏现有功能。

3- 记录代码行为: 作为如何使用代码的文档。


?有效单元测试的原则

⚡ 一次测试一件事

每个单元测试都应该关注功能的一个方面。这使得测试更容易理解和维护。如果测试失败,你就会确切地知道问题出在哪里。

function add(a, b) {
    return a + b;
}

// Test case for the add function
function testAdd() {
    // Test adding positive numbers
    assertEqual(add(2, 3), 5, '2 + 3 should be 5');
    // Test adding negative numbers
    assertEqual(add(-1, -1), -2, '-1 + -1 should be -2');
}

// A simple assertion function
function assertEqual(actual, expected, message) {
    if (actual !== expected) {
        throw new Error(message);
    }
}

⚡ 使测试可读

您的测试应该易于阅读和理解。为您的测试函数使用描述性名称和清晰的断言。这可以帮助其他人(和您自己)快速掌握每个测试正在验证的内容。

function isEven(number) {
    return number % 2 === 0;
}

// Descriptive test function
function testIsEven() {
    assertEqual(isEven(4), true, '4 should be even');
    assertEqual(isEven(5), false, '5 should be odd');
}

⚡ 使用清晰且具有描述性的名称

测试用例的名称应该描述他们正在测试的内容。这增强了测试的可读性和可维护性。

function calculateTotalPrice(items) {
    return items.reduce((total, item) => total + item.price, 0);
}

// Descriptive test case names
function testCalculateTotalPrice() {
    assertEqual(calculateTotalPrice([{ price: 10 }, { price: 20 }]), 30, 'Total price should be 30 for items costing 10 and 20');
    assertEqual(calculateTotalPrice([{ price: 5 }]), 5, 'Total price should be 5 for a single item costing 5');
}

⚡ 保持测试独立

每个测试应该独立于其他测试。依赖共享状态的测试可能会导致不稳定的测试并使调试变得困难。

function multiply(a, b) {
    return a * b;
}

// Independent test cases
function testMultiply() {
    assertEqual(multiply(2, 3), 6, '2 * 3 should be 6');
    assertEqual(multiply(0, 10), 0, '0 * 10 should be 0');
}

⚡ 适当使用模拟和存根

模拟和存根可以通过模拟依赖关系来帮助隔离被测试的代码单元。但是,请谨慎使用它们以避免测试过于复杂。

// Example of using a mock for a database call
function getUser(id) {
    // Imagine this function makes a database call
    return database.getUserById(id);
}

function testGetUser() {
    const mockDatabase = {
        getUserById: (id) => ({ id, name: 'John Doe' }),
    };

    const result = getUser(1, mockDatabase);
    assertEqual(result.name, 'John Doe', 'User name should be John Doe');
}

⚡ 自动化测试

自动运行单元测试以确保它们定期执行。持续集成 (CI) 工具可以帮助您在发生更改时自动运行测试。

如果您使用像 Jest 这样的测试框架,您可以在 package.json 中设置一个脚本:

"scripts": {
    "test": "jest"
}

运行 npm test 将执行所有测试并提供有关其状态的反馈。


结论

编写干净有效的单元测试对于维护高质量代码至关重要。

通过遵循 Clean Code 第 9 章中概述的原则,您可以确保您的测试可靠、可理解且有价值。

在 JavaScript 代码中实现这些实践不仅可以提高测试质量,还有助于构建更健壮且可维护的代码库。

快乐编码!

以上是了解干净的代码:单元测试 ⚡的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn