본문 바로가기
부트캠프교육중/CS

TDD (소프트웨어 개발 방법론)

by 뭉지야 2023. 3. 29.
728x90

# 테스트 통과 여부를 확인하며 개발하는 소프트웨어 개발 방법론을 TDD(Test-Driven-Development: 테스트 주도 개발)라고 합니다.

 

#소프트웨어 검증방법 => 테스트 코드


TDD-(Test-driven Development)-코드를 작성하기 전에 테스트를 쓰는 소프트웨어 개발 방법론.-개발자 자신이 바람직하다고 생각하는 코드의 결과를 미리 정의하고, 이것을 바탕으로 코드를 작성하는 법.-TDD를 통해 소프트웨어를 개발한다는 것은 작은 단위의 테스트 케이스를 작성하고, 이를 통과하는 코드를 작성하는 과정을 반복하는 것을 의미.

 

-1의 과정을 마치기 전에 2의 작업을 시작하지 않도록 주의해야 합니다.

- 2를 진행할 때에는, 1의 테스트를 통과할 정도의 최소 코드만 작성해야 합니다.

- 결과적으로 버그가 더 적은 코드를 짤 수 있게 됩니다. 또, 불필요한 설계를 피할 수 있고, 테스트 코드의 요구 사항에 집중할 수 있게 됩니다. 일반적으로 TDD를 따라 소프트웨어를 개발할 경우 그렇지 않은 경우보다 결함을 50 ~ 90% 까지 감소시킬 수 있습니다.

 

# 테스트 코드를 작성하는 방법 

- describe, it, assert, expect : JavaScript 내장 기능이 아니라 테스트 프레임워크에서 제공하는 테스트 작성을 위한 도구.

- mocha라는 테스트 프레임워크와 chai라는 라이브러리.


< React 환경에서 테스트하기 >

-React에서 테스트는 Testing Library, Jest를 이용해서 할 수 있습니다. (Testing Library, Jest 둘다 React에서만 쓸 수 있는 라이브러리는 아닙니다. Vue, Svelte 등 다른 프레임워크에서도 이용할 수 있습니다.)

-Testing Libarary에서 React용 React Testing Library을 제공하고 있기 때문에, create-react-app을 이용하여 React 프로젝트를 생성하면 자동으로 Testing Libarary를 이용할 수 있습니다. 이렇게 설치한 Testing Library는 테스트를 실행하고 싶은 컴포넌트나 클릭 이벤트등 다양한 곳에 쓸 수 있습니다.

- Jest는 JavaScript의 Testing Framework / Test Runner로써, 테스트 파일을 자동으로 찾아 테스트를 실행하고, 테스트를 실행한 결과 기대만큼 올바른 값을 가지고 있는지 함수를 이용하여 체크하여 테스트가 성공인지 실패인지를 판단해 줍니다.

-Testing Libarary와 Jest는 역할이 각각 다르기 때문에 React에 대한 테스트를 진행할 때는 어느 한쪽 라이브러리를 이용하는 것만으로는 테스트를 할 수 없습니다.

 

 

< React 기본 테스트 환경 확인하기 >

1. 일단 npx create-react-app 실행하여 새로운 프로젝트를 생성한다.

-생성된 폴더에서 package.json 파일을 확인하면 dependencies 안에 @testing이라는 접두어가 붙은 3개의 라이브러리를 확인할 수 있습니다. 이것들이 바로 테스트를 수행할 때 이용하는 라이브러리입니다.

//package.json

{
  "name": "0329todo",
  "version": "0.1.0",
  "private": true,
  "dependencies": {
    "@testing-library/jest-dom": "^5.16.5",
    "@testing-library/react": "^13.4.0",
    "@testing-library/user-event": "^13.5.0",
    "react": "^18.2.0",
    "react-dom": "^18.2.0",
    "react-router-dom": "^6.3.0",
    "react-scripts": "5.0.1",
    "styled-components": "^5.3.9",
    "web-vitals": "^2.1.4"
  },
  "scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test",
    "eject": "react-scripts eject"
  },

 

- @testing-library/jest-dom : jest-dom에서 제공하는 custom matcher를 사용할 수 있게 해줍니다.

- @testing-library/react : 컴포넌트의 요소를 찾기 위한 query가 포함되어 있습니다.

- @testing-library/user-event : click 등 사용자 이벤트에 이용됩니다.

 

//App.test.js

import { render, screen } from '@testing-library/react';
import App from './App';

test('renders learn react link', () => {
  render(<App />);
  const linkElement = screen.getByText(/learn react/i);
  expect(linkElement).toBeInTheDocument();
});

-다시 src 폴더 안을 확인해 보면, setupTests.js 와 App.test.js 라는 이름의 파일을 확인할 수 있습니다.

-App.test.js 파일에는 위의 코드처럼 간단한 테스트가 이미 만들어져 있습니다.

 

# test함수

- test 함수는 Jest 함수로 테스트를 실행할 때 반드시 이용하는 함수입니다.

-test 함수의 첫 번째 인자는 테스트가 어떤 내용인지 나중에 다시 읽어도 테스트 내용을 알 수 있는 설명을 작성합니다.

두 번째 인자는 하고자 하는 테스트를 함수의 형태로 넣습니다.

 

#두번째 인자로 들어간 함수를 살펴보자.

-첫번째 줄을 보면, 테스트하고자 하는 컴포넌트를 render()함수로 전달하고 있습니다. react-testing-library에서는 테스트를 진행할 컴포넌트를 render()함수의 인자로 전달합니다.
-두번째 줄에 있는 screen의 다양한 메소드 중 getByText() 메서드를 이용하여 render()에서 가져온 App 컴포넌트 중 "learn react"라는 문자열이 있는지 확인하여 linkElement에 할당하고 있습니다. (“i”는 Regular Expression으로 "i"를 붙임으로써 대소문자를 구분하지 않게 만들어 줍니다.)
-세번째 줄에서는 expect 함수의 인자로 지정한 요소가 document.body에 존재하는지 toBeInTheDocument 함수를 사용하여 체크하고 있습니다. 여기서 toBeInTheDocument 함수는 matchers 함수라고 부릅니다.

 

# test 함수, expect 함수는 Jest의 함수고, toBeInTheDocument는 jest-dom 라이브러리에 포함된 Custom matchers입니다.

 

//setupTests.js

import '@testing-library/jest-dom';

- jest-dom은 src 폴더의 setupTests.js 파일 내에서 import 되고 있습니다.

- setupTests.js 파일에서 import를 삭제하면 toBeInTheDocument 함수를 이용할 수 없습니다.

 

< 테스트 직접 만들기 >

-파일명을 <파일명>.test.js와 같이 해주시면 됩니다. <파일명>.spec.js에서도 가능합니다.

파일명을 이렇게 짓고 테스트를 작성하면, Jest가 테스트 파일로 판단하여 작동합니다.

-테스트는 test 함수 안에 쓰고 test 함수의 첫 번째 인자에는 테스트에 대한 설명을, 두 번째 인자에는 테스트의 내용을 함수의 형태로 작성합니다.

test('2 더하기 2는 4', () => {
  expect(2 + 2).toBe(4);
 });
it('2 더하기 2는 4', () => {
  expect(2 + 2).toBe(4);
 });

- test 함수 대신 it 함수를 사용해도 같은 결과가 나옵니다.

- describe함수를 사용하면 it함수나 test함수를 하나의 파일에 여러 개 포함할 수 있습니다.

describe('간단한 테스트들', () => {
  test('2 더하기 2는 4', () => {
   expect(2 + 2).toBe(4);
  });
  test('2 빼기 1은 1', () => {
    expect(2 - 1).toBe(1);
  });
});

- describe 함수 블록은 Test Suites라고 불리며 test/it 함수 블록은 Test(Test Case)라고 합니다.


출처

코드스테이츠

 

 

 

 

 

 

 

 

728x90

'부트캠프교육중 > CS' 카테고리의 다른 글

가비지 컬렉션과 메모리  (0) 2023.03.28
문자열과 그래픽  (0) 2023.03.28
스레드  (0) 2023.03.28
운영체제, 프로세스  (0) 2023.03.28
Memory  (1) 2023.03.28