在 GitHub 上赢得“构建通过”徽章✅!使用 Travis CI 测试你的 Express 应用

2025-06-07

在 GitHub 上赢得“构建通过”徽章✅!使用 Travis CI 测试你的 Express 应用

Travis CI 为 GitHub 上的开源项目提供免费的测试构建。不接受他们的建议真是太愚蠢了。他们的邮件提醒功能之前已经多次拯救了我的项目。

在本教程中,我们将设置一个 Express 应用以进行持续集成 (CI)。每当我们提交到master分支时,Travis CI 都会克隆我们的代码库,启动 Linux 云构建,安装所有必需的依赖项,并运行测试!希望测试能够顺利通过!如果没有通过,我们会收到警报。

安装

package.json使用以下方式设置快速文件: npm init -y。然后抓取 Express:npm i express --save以及 supertest 和 Jest,我们的开发依赖项:npm i supertest jest --save-dev

或者克隆存储库,作为项目的实时示例!

将应用程序从 Express 中移除

Express 的默认 hello world 应用程序如下所示:

// app.js

const express = require('express');
const app = express();
const port = 3000;

app.get('/', async (req, res) => res.status(200).send('Hello World!'));

app.listen(port, () => console.log(`Our app listening on port ${port}!`));
Enter fullscreen mode Exit fullscreen mode

这适用于手动测试。我们可以运行这个应用程序并检查是否返回了正确的页面——但如果我们有 50 个包含复杂逻辑的页面怎么办?我们希望将这个过程自动化。第一步是导出我们的app对象。运行测试时,我们不需要实时的 HTTP 服务器。

让我们改变我们的 hello world 应用程序。

// app.js

const express = require('express');
const app = express();

app.get('/', async (req, res) => res.status(200).send('Hello World!'));

// Don't listen, just export
module.exports = app; // <--
Enter fullscreen mode Exit fullscreen mode

太棒了。但是我们现在该如何启动我们的应用程序呢?我们将使用关注点分离,并将调用listen()放在另一个名为 的文件中server.js(该文件也使用该app对象!)

// server.js

const app = require('./app');
const port = 3000;

app.listen(port, () => console.log(`Our app listening on port ${port}!`))

Enter fullscreen mode Exit fullscreen mode

要启动我们的应用程序,我们现在使用node server.js。让我们将其添加到我们的 中package.json,以便人们可以简单地使用npm start。默认情况下,Node.js 会查找server.js文件,但让我们明确一点。

"scripts": {
  "start": "node server.js"
},
Enter fullscreen mode Exit fullscreen mode

测试

一种常见的模式是将测试放在根目录中名为 的文件夹中。另一种模式是在 之前插入__tests__重复要测试的文件的名称。因此,.test.js__tests__/app.test.js

我们将使用 Jest 作为测试运行器。Jest 会__tests__在其默认搜索中查找文件内部,并运行找到的任何测试文件。您可以使用 自定义测试搜索--testMatch

默认情况下,[Jest] 会在文件夹中查找 .js、.jsx、.ts 和 .tsx 文件__tests__,以及任何带有 .test 或 .spec 后缀的文件(例如 Component.test.js 或 Component.spec.js)。它还会查找名为 test.js 或 spec.js 的文件。

在我们的测试中,supertest 会模拟对我们对象的请求。模拟请求比启动服务器并实时发送请求更快、更可预测。在需要时,app它还能更轻松地编写设置和拆卸方法。

// __tests__/app.test.js

const app = require('../app');
const request = require('supertest');

// `describe` is used for test components
describe('GET /', () => {

    // `it` is for individual tests
    it('responds with 200', async () => {
        await request(app)
            .get('/')
            .expect(200); // If the status code is not 200, this test will fail
    });
})
Enter fullscreen mode Exit fullscreen mode

让我们在代码中添加另一行,package.json以便测试能够使用 运行。我们使用和别名的npm test原因是,这样我们的软件对于第一次使用它的开发人员来说是可预测的,并且能够与其他软件包很好地兼容。starttest

"scripts": {
  "start": "node server.js",
  "test": "jest"
},
Enter fullscreen mode Exit fullscreen mode

npm test产生以下输出。

 PASS  __tests__/app.test.js
  GET /
    √ responds with 200 (39ms)

Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        2.681s
Ran all test suites.
Enter fullscreen mode Exit fullscreen mode

特拉维斯·CI

我们将此代码放入GitHub 仓库,并安装Travis CI GitHub App。请确保您正在测试的仓库已启用 Travis CI。

存储库访问

正如 Travis CI教程告诉我们的:

将 .travis.yml 文件添加到您的存储库以告诉 Travis CI 要做什么。

在我们的例子中,就是这么简单。除了指定测试构建使用的 Node.js 版本之外,我们不需要指定任何其他设置。Travis CI 将使用默认的测试别名npm test

# .travis.yml

language: node_js
node_js:
 - lts/* # Long Term Support
Enter fullscreen mode Exit fullscreen mode

提交并推送此文件到 GitHub 将立即加入测试构建队列。您可以在 观看构建的实时执行情况travis-ci.com/{your-username}/{your-repo},并稍后查看是否存在问题。您也可以使用此页面获取 Travis CI 构建状态徽章的 Markdown 文件!

实时构建

如果您遇到问题,请发推文@healeycodes或在存储库中提出问题!


与 150 多名订阅我的关于编程和个人成长的新闻通讯的人一起!

我发布有关科技的推文@healeycodes

文章来源:https://dev.to/healeycodes/earn-a-build-passing-badge-on-github--testing-your-express-app-with-travis-ci-1m2f
PREV
通过构建笔记应用程序学习存储 API
NEXT
构建一个 Python 机器人来查找你网站的死链接