>  기사  >  웹 프론트엔드  >  Jest 요약: 언제 실행되나요?

Jest 요약: 언제 실행되나요?

王林
王林원래의
2024-07-19 15:59:301004검색

Jest Recap: What Runs When?

핵심요약: 실행 명령

  1. 최상위 수준과 explain() 블록에 있는 모든 것(describe() 블록은 기본적으로 IIFE입니다)
  2. 전전체()
    1. 최상위
    2. 1단계 설명()
    3. N번째 수준 설명()
  3. 각각()
    1. 최상위
    2. 1단계 설명()
    3. N번째 수준 설명()
  4. 테스트()
  5. 각각()
    1. N번째 수준 설명()
    2. 1단계 설명()
    3. 최상위
  6. 결국()
    1. N번째 수준 설명()
    2. 1단계 설명()
    3. 최상위

부인 성명

당신은 농담과 단위 테스트에 대한 기본적인 이해가 있다고 가정합니다. 후크의 의미는 설명하지 않겠습니다. 치트 시트/참조 유형의 게시물에 가깝습니다.

규칙이 있습니다

처음에는 농담이 마법 같은 일을 하는 것처럼 보입니다. 언제 실행되나요? 하지만 조금만 생각해 보면 명확 덜 혼란스러워집니다.

다음의 간단한 "규칙"이 도움이 될 수 있습니다.

  1. 각 파일은 독립적으로 실행됩니다. A.test.js에서 수행하는 작업은 B.test.js에 영향을 주지 않습니다. (외부 리소스에 액세스하기 시작하지 않는 한)
  2. explain() 콜백은 즉시 실행됩니다.
  3. 후크(beforeAll/afterAll, beforeEach/afterEach)는 외부 범위(최상위/모듈)에서 내부 범위(설명)로 실행됩니다.

기본 예

console.log("./<start>");

beforeAll(() => {
    console.log("./beforeAll");
})
beforeEach(() => {
    console.log("./beforeEach");
})
afterAll(() => {
    console.log("./afterAll");
})
afterEach(() => {
    console.log("./afterEach");
})

describe("foo", () => {
    console.log("./describe(foo)/<start>");

    beforeAll(() => {
        console.log("./describe(foo)/beforeAll");
    })
    beforeEach(() => {
        console.log("./describe(foo)/beforeEach");
    })
    afterAll(() => {
        console.log("./describe(foo)/afterAll");
    })
    afterEach(() => {
        console.log("./describe(foo)/afterEach");
    })

    test("testFoo", () => {
        console.log("./describe(foo)/test(testFoo)");
    })

    console.log("./describe(foo)/<end>");
})

describe("bar", () => {
    console.log("./describe(bar)/<start>");

    beforeAll(() => {
        console.log("./describe(bar)/beforeAll");
    })
    beforeEach(() => {
        console.log("./describe(bar)/beforeEach");
    })
    afterAll(() => {
        console.log("./describe(bar)/afterAll");
    })
    afterEach(() => {
        console.log("./describe(bar)/afterEach");
    })

    test("testBar", () => {
        console.log("./describe(bar)/test(testBar)");
    })
    test("testOtherBar", () => {
        console.log("./describe(bar)/test(testOtherBar)");
    })

    console.log("./describe(bar)/<end>");
})

console.log("./<end>");

다음은 결과입니다(다른 출력을 제거한 후):

./<start>
./describe(foo)/<start>
./describe(foo)/<end>
./describe(bar)/<start>
./describe(bar)/<end>
./<end>

./beforeAll

./describe(foo)/beforeAll
./beforeEach
./describe(foo)/beforeEach
./describe(foo)/test(testFoo)
./describe(foo)/afterEach
./afterEach
./describe(foo)/afterAll

./describe(bar)/beforeAll
./beforeEach
./describe(bar)/beforeEach
./describe(bar)/test(testBar)
./describe(bar)/afterEach
./afterEach

./beforeEach
./describe(bar)/beforeEach
./describe(bar)/test(testOtherBar)
./describe(bar)/afterEach
./afterEach
./describe(bar)/afterAll

./afterAll

무슨 일이 일어나나요?

최상위 수준 및 설명 콜백의 모든 것이 즉시 실행됩니다.

./<start>
./describe(foo)/<start>
./describe(foo)/<end>
./describe(bar)/<start>
./describe(bar)/<end>
./<end>
[...]

최상위 수준의 beforeAll과 afterAll은 모든 테스트에 대한 "중괄호"입니다. 각각은 한 번만 실행됩니다.

[...]

./beforeAll

[...]

./afterAll

./describe(*)/beforeAll 및 ./describe(*)/afterAll은 콜백을 설명하는 모든 테스트에 대한 중괄호입니다. 각각은 한 번만 실행됩니다.

[...]

./describe(foo)/beforeAll
[...]
./describe(foo)/afterAll

./describe(bar)/beforeAll
[...]
./describe(bar)/afterAll

[...]

beforeEach와 afterEach는 각 테스트 주위에 중괄호입니다. 최상위 레벨은 외부 버팀대입니다. 설명 수준은 내부 중괄호
입니다.

[...]
./beforeEach
./describe(*)/beforeEach
[...]
./describe(*)/afterEach
./afterEach
[...]

고급 버전

이는 설명 블록이 중첩된 고급 예입니다. 실행 단계의 계층적 특성을 강조하기 위해 XMLish 결과를 생성합니다.

console.log("<top-level>");

beforeAll(() => {
    console.log("<all>");
})
beforeEach(() => {
    console.log("<each>");
})
afterAll(() => {
    console.log("</all>");
})
afterEach(() => {
    console.log("</each>");
})

describe("foo", () => {
    console.log("<describe id=\"foo\">");

    beforeAll(() => {
        console.log("<all in=\"foo\">");
    })
    beforeEach(() => {
        console.log("<each in=\"foo\">");
    })
    afterAll(() => {
        console.log("</all>  <!-- in=\"foo\" -->");
    })
    afterEach(() => {
        console.log("</each>  <!-- in=\"foo\" -->");
    })

    test("testFoo", () => {
        console.log("<test in=\"foo\" id=\"testFoo\" />");
    })

    console.log("</describe> <!-- id=\"foo\" -->");
})

describe("bar", () => {
    describe("barinner", () => {
        console.log("<describe id=\"barinner\">");

        beforeAll(() => {
            console.log("<all in=\"barinner\">");
        })
        beforeEach(() => {
            console.log("<each in=\"barinner\">");
        })
        afterAll(() => {
            console.log("</all> <!-- in=\"barinner\" -->");
        })
        afterEach(() => {
            console.log("</each> <!-- in=\"barinner\" -->");
        })

        test("testBarInner", () => {
            console.log("<test in=\"barinner\" id=\"testBarInner\" />");
        })

        console.log("</describe> <!-- id=\"barinner\" -->");
    })

    console.log("<describe id=\"bar\">");

    beforeAll(() => {
        console.log("<all in=\"bar\">");
    })
    beforeEach(() => {
        console.log("<each in=\"bar\">");
    })
    afterAll(() => {
        console.log("</all> <!-- in=\"bar\" -->");
    })
    afterEach(() => {
        console.log("</each> <!-- in=\"bar\" -->");
    })

    test("testBar", () => {
        console.log("<test in=\"bar\" id=\"testBar\" />");
    })
    test("testOtherBar", () => {
        console.log("<test in=\"bar\" id=\"testOtherBar\" />");
    })

    console.log("</describe> <!-- id=\"bar\" -->");
})

console.log("</top-level>");

일부 정리 및 포맷 후의 출력은 다음과 같습니다.

<top-level>
    <describe id="foo">
    </describe> <!-- id="foo" -->

    <describe id="barinner">
    </describe> <!-- id="barinner" -->

    <describe id="bar">
    </describe> <!-- id="bar" -->
</top-level>

<all>
    <all in="foo">
        <each>
            <each in="foo">
                <test in="foo" id="testFoo" />
            </each>  <!-- in="foo" -->
        </each>
    </all>  <!-- in="foo" -->
    <all in="bar">
        <all in="barinner">
            <each>
                <each in="bar">
                    <each in="barinner">
                        <test in="barinner" id="testBarInner" />
                    </each> <!-- in="barinner" -->
                </each> <!-- in="bar" -->
            </each>
        </all> <!-- in="barinner" -->
        <each>
            <each in="bar">
                <test in="bar" id="testBar" />
            </each> <!-- in="bar" -->
        </each>
        <each>
            <each in="bar">
                <test in="bar" id="otherBar" />
            </each> <!-- in="bar" -->
        </each>
    </all> <!-- in="bar" -->
</all>

실행 순서에 대해 알아야 할 것은 이것이 전부입니다.

위 내용은 Jest 요약: 언제 실행되나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
이전 기사:웹 개발의 심스다음 기사:웹 개발의 심스