테스트에 조건부 논리를 작성하지 마십시오

6667 단어 testingprogramming
Original Article

조건부 논리는 테스트에 포함되어서는 안 됩니다.



이것은 가장 중요한 규칙 중 하나입니다.
좋은 테스트 작성.

다음과 같은 구성을 포함하는 모든 테스트를 의심해야 합니다.if , while , for , try 또는 귀하의 언어에 있을 수 있는 유사한 모든 것.

여기에는 두 가지 주요 이유가 있습니다.

1. 코드를 읽도록 강요합니다.



테스트가 실패한 이유를 알기 위해 코드를 읽을 필요는 없습니다.

import {expect} from 'vitest';
...
test('JacketAdvisor', () => {
    ...
    if (weatherOutside === 'cold') {
        expect(sut.shouldBringAJacket()).toBeTruthy()
    } else {
        expect(sut.shouldBringAJacket()).toBeFalsy()
    }
}) 



위의 코드는 상당히 읽기 쉽지만 테스트가 실패하면 이 코드를 얻습니다.
메시지

FAIL  path/to/tests > JacketAdvisor
AssertionError: expected true to be falsy


코드를 열어 왜 실패했는지 알아내야 합니다.
각 사례는 다른 테스트에서 처리되어야 합니다.


import {describe, expect} from 'vitest';

...

describe('JacketAdvisor', () => { 
    test('with cold weather shouldBringAJacket returns true', () => {
        ...
        expect(sut.shouldBringAJacket()).toBeTruthy()
    })

    test('without cold weather shouldBringAJacket returns false', () => {
        ...
        expect(sut.shouldBringAJacket()).toBeFalsy()
    })
})


이렇게하면 테스트가 실패하면 다음과 같은 결과가 나타납니다.

FAIL  path/to/tests > JacketAdvisor > with cold weather shouldBringAJacket returns true
AssertionError: expected true to be falsy


그리고 테스트가 실패한 이유를 즉시 알 수 있습니다.

2. 테스트되지 않은 코드를 소개합니다.



이것은 아마도 더 교활한 문제일 것입니다. 사용하는 테스트되지 않은 논리가 있는 경우
코드를 테스트하기 위해 실제로 코드를 만들고 있는지 확인하는 테스트가 없습니다.
올바른 주장.

예를 들어 두 번째 예에서 실수로 weatherOutside를 'col'로 설정한 경우
위의 경우 첫 번째 테스트는 실패합니다. 하지만 두 번째 예에서 이 코드expect(sut.shouldBringAJacket()).toBeTruthy()
절대 실행되지 않습니다. 생산에 들어갈 때까지 코드가 잘못되었다는 것을 알 수 없습니다.
테스트 코드가 잘못되었고 버그가 있었기 때문입니다.

하지만 일부 주장에는 조건부 논리가 필요합니다.



대부분의 경우 조건부 논리를 추가해야 한다고 생각할 때
해야 할 일은 테스트 중인 시스템을 적절하게 격리하는 것입니다. 그러나 예외가 있는 경우
조건부 논리를 도입하는 것이 합리적입니다.

1. 레거시 코드로 작업하고 있습니다.



레거시 코드와 관련하여 모든 규칙이 적용되지 않습니다. 추가해야 하는 경우
테스트 도구를 설정하고 안전하게 리팩토링할 수 있도록 하는 약간의 논리
그 코드, 그럼 그냥 해. 완벽한 것이 좋은 것을 방해하지 않도록 하십시오.

일시적이라는 점만 기억하세요. 시스템을 리팩터링하면
구성 요소를 개별적으로 테스트할 수 있는 지점 해당 구성 요소를 테스트하고
이전 테스트를 삭제하십시오.

2. 테스트 라이브러리 또는 사용자 지정 어설션 작성



조건 논리가 없는 테스트는 실제로 불가능합니다.
후드 아래에서 모든 주장은 다음과 같기 때문입니다.

function assertTruthy(val) {
    if (val == false) {
        throw new AssertionError({message: 'expected true to be false'});
    }
}


"테스트에 조건부 논리를 쓰지 마십시오"대신 규칙은 다음과 같아야 합니다.
"테스트 코드에는 한 수준을 넘어서는 논리가 있어서는 안 되며
단언을 하기 위한 분기"(물론 그다지 좋은 제목은 아니지만).

필요한 경우 조건 논리를 사용하여 사용자 지정 어설션을 작성할 수 있습니다.
테스트에 사용할 수 있습니다. 이는 테스트와 달리 어설션이 허용되기 때문에 허용됩니다.
터무니없는 테스트 없이 매우 쉽게 테스트할 수 있습니다.

당신의 어설션이 올바른 것을 던진다고 주장하는 테스트를 작성하는 것을 기억하세요
예외를 방지하고 해당 어설션 내에서 지나치게 복잡한 분기 논리를 피합니다.

그러나 이것들은 예외입니다. 조건부 논리는 여전히 냄새로 취급되어야 합니다.
이 규칙을 우회하기 위해 사용자 지정 어설션을 많이 작성해서는 안 됩니다.

좋은 웹페이지 즐겨찾기