您知道,当您查看刚刚开始使用的代码库时,会感到某种焦虑,却发现这是一片巨大的未知荒野。没有编写任何测试来防范意外情况。
这就像在鸿沟上走钢丝一样,知道一个失误可能会让整个项目陷入混乱。
如果您使用过 0 次测试的代码库,您就会知道,考虑用当前不存在的测试从头开始覆盖整个代码库可能是一项艰巨的任务。
这个过程需要付出近乎艰巨的努力:您必须仔细研究每个函数、方法和组件,集思广益所有潜在的边缘情况,构建测试套件代码,并使其顺利运行。
这甚至还没有涉及达到有意义的覆盖范围所需的时间。我们要讨论几周甚至几个月的时间,然后您才能坐下来说:“是的,我们已经达到了 80% 或 90% 的覆盖率。”
这就是为什么我很高兴分享我过去几个月所做的工作。这次旅程将我们带到了自动化测试领域与人工智能的神奇世界相遇的地方。来认识一下 Pythagora,这是一款开源开发工具,它将成为您新的最好的朋友。
在这篇博文中,我将向您展示如何使用 Pythagora 启动自动化测试,它利用 AI 的力量为您的整个代码库生成测试,所有这些都只需一个 CLI 命令,并希望将您的代码库提高到 80% – 90一天内的代码覆盖率% 。
我们都知道“罗马不是一天建成的”这句话。对于全面、有效的测试套件来说也是如此。这是一个细致而艰巨的过程,但一旦走过这条崎岖的道路,成就感是深刻的。
让我们一起完成从头开始创建测试套件并达到令人垂涎的 80% – 90% 代码覆盖率所涉及的必要步骤。
在第一阶段,你就像一个在空白画布前的画家。世界充满了可能性,你可以自由地创造杰作。
在这种情况下,您的杰作包括选择要编写的测试类型,找到要使用的正确测试框架,以及采用适合您的特定环境的最佳实践。
您正在考虑单元测试、集成测试、E2E 测试还是三者的混合?
虽然这个初始设置通常被视为“简单”的部分,但它绝不是在公园散步。做出明智的决定需要时间、研究,也许还需要几杯咖啡。
一旦你的基本结构就位,就该卷起袖子深入研究细节了。现在,您需要检查整个代码库,一次一个函数,并为每个函数编写测试。您的任务是确保您的测试触及每个函数、方法或组件中的所有代码行。
这项任务类似于探索一个错综复杂的迷宫。你需要走遍每一条路,拐过每一个拐角,并确保不遗余力。
编写这些测试是一个详细且耗时的步骤。这不仅仅是写几行代码那么简单;它是关于理解函数的目的、其预期输出以及它如何在应用程序中交互。
经过第一轮测试后,您可能会松一口气。不过,坚持住;谜题还剩下一个重要的部分。是时候深入探索边缘案例的狂野、不可预测的世界了。
这部分可能不会增加您的代码覆盖率,但它对于测试代码的稳健性和弹性至关重要。
这些所谓的负面测试有助于评估代码对各种输入的反应,特别是那些处于预期行为边缘的输入。从空输入到突破数据类型限制的值,这些测试旨在模仿现实世界中的用户行为,其中用户通常有能力将代码推向您从未想过的方向。
从头开始创建测试套件是一项艰巨的任务。但请放心,您所做的每一次努力都是朝着创建更强大、更可靠、更有弹性的应用程序迈出的一步。
请记住,您并不孤单。我们都经历过这样的情况,有了像毕达哥拉斯这样的工具,这个过程并不像看起来那么令人畏惧。
另一方面,使用 Pythagora,您可以输入:
npx pythagora --unit-tests --path ./path/to/repo
Pythagora 将浏览所有文件夹中的所有文件,为其遇到的每个函数构建单元测试。现在,您可以坐下来放松一下,或者去吃午饭,让它运行一段时间,直到它完成编写测试。
好吧,但是等等,毕达哥拉斯到底是什么?
我一直梦想着一个可以为我创建自动化测试的世界。但现实并非那么简单。没有人像您一样了解您的代码,这使得其他人很难为其起草有效的自动化测试。结果往往达不到你自己所能达到的目标。
然而,当ChatGPT出现后,一切都改变了。当我修改这项技术时,我发现自己在想:“我们能否利用 ChatGPT 的强大功能来编写自动化测试?”
好奇心被激发,我更深入地研究,尝试其功能,我的发现让我大吃一惊。
ChatGPT 展示了令人难以置信的理解代码的能力,让我们看到了自动化测试中充满希望的新途径。
因此,毕达哥拉斯的想法诞生了。
Pythagora 是一款开源开发工具,其设计时牢记一个使命:使自动化测试变得自治。我设想这样一个世界:开发人员(例如你和我)可以专注于创建功能,而不会陷入测试编写和维护的泥潭。
为了实现这一愿景,它使用了 GPT-4。
目前,Pythagora 具有编写单元测试和集成测试的能力。然而,出于本博文的目的,我们将重点关注其生成单元测试的能力。
要安装 Pythagora,你只需要执行npm i pythagora
。就是这样!毕达哥拉现在为您服务。
安装 Pythagora 后,您需要使用 API 密钥对其进行配置。这可以是 OpenAI API 密钥或 Pythagora API 密钥。
要使用 OpenAI API 密钥,您应该运行以下命令:
npx pythagora --config --openai-api-key <OPENAI_API_KEY>
需要注意的是,如果您选择使用自己的 OpenAI API 密钥,则必须有权访问 GPT-4。
或者,您可以从此链接获取 Pythagora API 密钥。获得后,请使用以下命令进行设置:
npx pythagora --config --pythagora-api-key <PYTHAGORA_API_KEY>
如果您希望为特定文件生成测试,请使用:
npx pythagora --unit-tests --path ./path/to/file.js
如果您有特定的功能,请使用:
npx pythagora --unit-tests --func <FUNCTION_NAME>
让我们掀开窗帘,看看发动机室。是什么让毕达哥拉斯运转起来?
从本质上讲,Pythagora 充当勇敢的探索者,深入研究代码库的错综复杂的迷宫。首先,它映射从文件导出的所有函数,以便可以从测试中调用它们。
显然,如果函数未导出,则无法从其文件外部调用它。顺便说一句,在生成几次测试后,它会让您思考您的代码库以及如何更好地构建它以便可以生成更多测试。
一旦识别出导出的函数,Pythagora 又向兔子洞迈出了一步:它依次研究每个函数,寻找内部调用的任何其他函数。
将其想象为代码库的考古学家,轻轻地拂去一层层灰尘,以暴露隐藏的联系和依赖关系。
换句话说,它会查找从正在测试的函数内部调用的所有函数,以便 GPT 可以更好地了解正在为其编写测试的函数的功能。
有了这些信息,毕达哥拉就准备利用人工智能的力量。它将收集到的代码打包并将其分派到 Pythagora API。在这里,真正的魔法发生了:精心制作的提示并交给 GPT 模型。
代码、API 和 AI 模型之间的交互会生成一套全面的单元测试,可供部署和投入使用。
API 服务器和使用的提示都是开源的。您可以深入研究、仔细研究它们,甚至如果您愿意的话也可以做出贡献。您可以在这里找到 Pythagora API 服务器,而创建单元测试的提示和关键要素都位于此文件夹中。
一旦 Pythagora 编写了所有要求的测试,您就可以开始检查它们了。这是该过程中至关重要的一步;了解已创建的内容并确保一切都符合您的期望非常重要。
请记住,Pythagora 创建基于 Jest 的测试。因此,要运行所有生成的测试,您只需运行:
npx jest ./pythagora_tests/
现在,请注意:毕达哥拉斯仍处于早期阶段。与所有年轻的项目一样,它在发展过程中肯定会遇到一些问题。因此,您可能会在初始运行中遇到失败的测试。
不要灰心;将此视为旅程的一部分。随着您的审查和对 Pythagora 的不断改进,这些失败的测试很快就会成为过去。
我们不要忘记好的一面。即使存在这些早期阶段的问题,Pythagora 也可以让您的代码库具有大量(可能高达90%)的测试覆盖率。
审查过程,尤其是较大的代码库,可能需要几个小时。请记住,您不仅要查看通过的测试,还要查看那些失败的测试。了解您提交到存储库的每个测试至关重要。毕竟,知识就是力量。
经过彻底的审查和潜在的调整后,您准备好进行最后一步:将生成的测试提交到您的存储库。通过最后一步,您将成功地将强大的单元测试套件集成到您的项目中。
所有这一切都是通过 Pythagora 的强大功能和终端中的几行命令来实现的。
好吧,现在我已经引起了你的兴趣,让我们深入研究真实的东西——毕达哥拉斯的实际例子。为了演示的目的,我们选择了一个著名的开源项目Lodash 。
仅运行一个 Pythagora 命令就足以生成多达 1604 个测试,整个 Lodash 存储库的代码覆盖率达到令人印象深刻的 91% 。但令人印象深刻的不仅仅是测试的数量。
其中, 13 项测试发现了 Lodash 主分支内的实际错误。
如果您想亲自查看这些内容,我们已经分叉了 Lodash 存储库并添加了 Pythagora 生成的测试。请随意在这里探索它们。
现在,让我们仔细看看其中一个发现了一个偷偷摸摸的错误的测试:
test(`size({ 'a': 1, 'b': 2, 'length': 9 })`, () => { expect(size({ 'a': 1, 'b': 2, 'length': 9 })).toBe(3); // test returns 9 });
在这个测试中,Lodash 的size
函数应该返回 JSON 对象的大小。但是,GPT 添加了一个名为length
的键,这是一个小技巧,用于查看 Lodash 是否会返回该键的值而不是对象的真实大小。
看来 Lodash 中了这个诡计,因为测试失败,返回“9”而不是预期的“3”。
这是一个很好的例子,展示了由 GPT 提供支持的 Pythagora 如何擅长发现很容易被忽视的棘手边缘情况。
通过自动生成大量此类复杂的测试用例,Pythagora 可以成为您值得信赖的助手,帮助您发现和修复您可能从未预料到的错误。
好了,开发人员朋友们,我们已经完成了。今天,我们已经踏上了一段相当长的旅程,穿越了缺乏测试的大量代码库的未知领域,并带着由我们值得信赖的人工智能工具 Pythagora 精心制作的自动化测试套件返回。
您已经了解到,即使面对令人畏惧的、未经测试的代码库,也无需绝望。创建大量测试套件的任务不再是一项艰巨的任务。
我们见证了 Pythagora 的魔力,因为它检查了著名的开源库 Lodash,并生成了1604 个测试,覆盖了令人惊叹的91% 的代码库。
我们看到毕达哥拉斯不仅关注数量,还关注测试的质量。它不仅仅是为了测试而创建测试,而是智能地发现可能被忽视的边缘情况和错误。
Pythagora 揭露了 Lodash 主分支中的 13 个真实错误,这证明了人工智能在软件测试中的强大功能。
现在,您应该更清楚地了解为什么像 Pythagora 这样的人工智能测试工具不仅是一种奢侈品,而且是当今快节奏的开发环境中的必需品。
因此,无论您是处理零测试的现有项目,还是开始一个新项目并希望从一开始就建立可靠的测试框架,请记住,您并不孤单。
Pythagora 在这里掌控一切,帮助您轻松生成有意义的测试,并节省您宝贵的时间,可以更好地用于开发出色的功能。
感谢您加入我的这段旅程,我迫不及待地想看看您如何在项目中使用毕达哥拉斯。快乐编码!
PS 如果您发现这篇文章有帮助,那么如果您为Pythagora Github 存储库加注星标,这对我来说意义重大,如果您尝试使用 Pythagora,请通过[email protected]告诉我们它的进展情况