빨강, 초록, 리팩토링.

8805 단어 testingtddjavascript
Red, Green, Refactor는 개발자가 테스트 스위트를 먼저 빌드하고 구현 코드를 작성하고 테스트 스위트가 통과하면 코드를 리팩터링하는 데 사용하는 TDD 접근 방식 또는 프레임워크입니다.

TDD를 옹호하는 컴퓨터 과학자 Robert C Martin에 따르면 우리는 통과해야 할 테스트 사례가 있을 때만 효과적인 코드를 작성할 수 있으며 테스트를 작성할 시간이 있는 유일한 시간은 구현 코드를 작성하기 전입니다. 가능한 방법은 Red, Green, Refactor 접근법을 사용하는 것입니다.

그들은 무엇인가?



제목에서 알 수 있듯이 작성 코드를 3개의 세그먼트로 구분할 수 있습니다.

빨간색 - 구현 코드 없이 테스트 스위트를 작성하여 실패하도록 합니다.

녹색 - 이제 구현 코드를 작성할 수 있으므로 테스트 스위트가 통과됩니다. 그 이상도 그 이하도 아닙니다.

리팩터링 - 테스트 스위트를 통과한 후 최적화 방법을 찾을 수 있습니다.

...헹구고 반복합니다. 이것은 완전히 기능하는 구현 코드가 있을 때까지 발생합니다.

Robert C. Martin("Uncle Bob")은 TDD를 실행하기 위한 간결한 규칙 세트를 제공합니다.
  • 실패한 단위 테스트를 통과하기 위한 프로덕션 코드만 작성하십시오.
  • 실패하기에 충분한 것보다 더 이상 단위 테스트를 작성하지 마십시오(컴파일 실패는 실패임).
  • 하나의 실패한 단위 테스트를 통과하는 데 필요한 것보다 더 이상 프로덕션 코드를 작성하지 마십시오.

  • 어떻게 이루어지나요?



    재귀를 사용하여 피보나치 문제의 구현을 보면 어떻게 수행되는지 확인할 수 있습니다. Jest playground을 사용합니다.

    반복 1



    두 개의 JavaScript 파일이 있습니다. 하나는 구현 코드를 포함하는 fib.js이고 테스트 스위트를 포함하는 fib.test.js입니다. 과잉으로 fib.js에 정의된 함수 없이 시작할 수 있습니다. 포스팅을 최대한 짧게 하도록 하겠습니다.

    빨간색



    재귀로 문제를 해결하고 있으므로 먼저 기본 사례를 먼저 정의해야 합니다. 즉, n이 2보다 작으면 n을 반환해야 합니다.

    먼저 다음과 같은 기본 사례에 대한 테스트 스위트를 작성해 보겠습니다.

    const fib = require("./fib");
    
    describe("base case , n < 2", () => {
      test("n = 1 will return 1", () => {
        expect(fib(1)).toBe(1);
      });
    });
    


    구현 코드가 없기 때문에 이것이 실패할 것으로 예상합니다.



    녹색



    이제 기본 사례에 대한 구현 코드를 작성해야 합니다. 테스트 도구 모음을 통과하는 데 필요한 코드만 기억하세요.

    function fib(n) {
      if (n < 2) {
        return n;
      }
    }
    module.exports = fib;
    


    이제 이 코드는 테스트 스위트를 만족합니다. 무엇 향후 계획? 위의 코드를 리팩토링하는 방법을 살펴보겠습니다.

    리팩토링



    위의 구현 코드에서 리팩토링할 것이 많지 않으므로 Iteration 2로 이동하겠습니다.

    반복 2



    빨간색



    이제 기본 사례가 있으므로 재귀 코드를 작성하는 다음 단계를 살펴보겠습니다. 재귀 사례를 테스트하기 위해 테스트 도구 모음을 확장해 보겠습니다.

    describe("recursive case , n >= 2", () => {
      test("n = 8 will return 21", () => {
        expect(fib(8)).toBe(21);
      });
      test("n = 15 will return 610", () => {
        expect(fib(15)).toBe(610);
      });
    });
    


    이제 테스트 도구 모음을 확장했으므로 다음과 같은 실패한 테스트 사례 결과를 살펴보겠습니다.



    짐작하셨겠지만 이는 구현 코드에서 n이 2보다 작은지 확인하고 n을 반환하기 때문입니다. 현재 n이 2보다 크거나 같은 경우를 처리하지 않습니다.

    녹색



    이제 테스트 스위트가 통과하도록 구현 코드를 작성합니다.

    function fib(n) {
      if (n < 2) {
        return n;
      } else {
        return fib(n - 1) + fib(n - 2);
      }
    }
    module.exports = fib;
    


    재귀를 사용하여 n >= 2인 경우를 처리하는 구현 코드를 작성했습니다. 이제 테스트 스위트가 통과하는 Green이 있습니다.



    리팩토링



    위의 코드를 리팩터링하기 위해 여기서 무엇을 할 수 있습니까? 그다지 많지는 않지만 외관상 업데이트로 원하지 않는 중괄호와 else 부분을 제거할 수 있습니다. if 부분에서 반환하기 때문입니다. 리팩토링 후 코드는 다음과 같습니다.

    function fib(n) {
      if (n < 2) return n;
    
      return fib(n - 1) + fib(n - 2);
    }
    module.exports = fib;
    


    반복 3



    음, 완전한 기능을 갖춘 모듈이 있기 때문에 Iteration 3은 없습니다. 여튼 여기서 끝입니다.

    결론



    이 접근 방식은 처음에는 시간이 많이 걸리는 것처럼 보일 수 있지만 일단 이 접근 방식을 사용하면 다른 방법보다 더 강력한 솔루션을 구축하면서 모든 사람의 삶을 더 쉽게 만드는 효과적인 테스트 가능한 코드를 작성하는 데 사용할 수 있습니다.

    알았어 잘가!

    좋은 웹페이지 즐겨찾기