JEST:是否有一个解决方案可以只对更改/受影响的文件运行测试?

lpwwtiir  于 2023-02-14  发布在  Jest
关注(0)|答案(1)|浏览(207)

Jest在这方面给出的解决方案很少,我已经尝试了大部分的解决方案,如--findRelatedTests--onlyChanged--changedSince,但每个解决方案都有一些缺点,我认为--changedSince是最适合我的。

jest --changedSince=origin/master --coverage

它主要涵盖了一些基本的场景,比如运行与更改的源文件相对应的测试文件,但是它没有处理一些场景,比如(如a.js已删除,且相同(a.js)正在使用(导入的)在另一个文件(比如b.js)中,它不会对任何文件(a.jsb.js)运行 tests
是否有一个干净的解决方案,可以处理所有的情况,如文件重命名/删除,动态导入,运行测试的父模块,其中它是导入或任何其他影响,可能会发生在您改变一个源文件?

vyswwuz2

vyswwuz21#

    • 快速解答**:没有。
    • 详细答案**:是的,但它不是那么干净或直接向前。

我通过三个步骤实现了这一目标。

    • 步骤1:**

你可以通过一些脚本来实现这一点。首先你需要通过Git得到一个所有更改过的文件的列表。
这可以通过如下函数实现:

const util = require("util")
const exec = util.promisify(require("child_process").exec)

const detectChangedFiles = async () => {
    try {
        const { stdout, stderr } = await exec("git diff origin/master --name-only")

        if (stderr) {
            throw new Error(stderr)
        }

        return stdout.replace(/\n/g, " ").replace(/client\//g, " ")

    } catch (error) {
        console.log(error)
    }
}
    • 第二步:**

其次,您需要获得这些文件的相关测试列表,如下所示:

const findRelatedTests = async () => {
    const changedFiles = await detectChangedFiles()

    try {
        const { stdout, stderr } = await exec(`jest --listTests --findRelatedTests ${changedFiles}`)

        if (stderr) {
            throw new Error(stderr)
        }

        if (!stdout) {
            console.log('No tests found for the changed files :)')
        } else {
            return stdout.replace(/\n/g, " ")
        }

    } catch (error) {
        console.log(error)
    }
}
    • 第三步:**

最后,您可能希望将所有这些测试都添加到jest以运行;

const runRelatedTests = async () => {
    const relatedTests = await findRelatedTests()

    if (relatedTests) {
        try {
            const { stdout, stderr } = await exec(`jest --ci --coverage ${relatedTests}`)

            if (stderr) {
                throw new Error(stderr)
            }
        } catch (error) {
            console.log(error)
        }
    }
}

这个实现的一个限制是我总是与master进行比较,这不是一个好的假设。在特殊情况下,一个分支可能选择与另一个分支合并。
这可以用几种方法来处理;
1.如果正在运行cli,请将参数传递给cli并在脚本中使用它
1.如果您在Gitlab这样的管道中运行,并假设这是一个MR/PR,请考虑使用一些可用的环境变量(在本例中为CI_MERGE_REQUEST_TARGET_BRANCH_NAME

相关问题