본문 바로가기
JavaScript/JavaScript

[JAVASCRIPT.INFO] 코드 품질

by HJ0216 2023. 10. 15.

이 글은 [모던 JavaScript 튜토리얼]을 공부하며 정리한 글입니다.

 

 

👉 기본 환경

- Language: JavaScript

- IDE: VS code

 

 


1. Chrome으로 디버깅하기

 

- 왼쪽

    - 파일 탐색 영역

- 중앙

    - 코드 에디터 영역: 소스 코드 보기 및 편집

- 오른쪽

    - 디버깅 영역

 

* 중단점 설정

    - Breakpoints를 활용해 중단점 위치로 이동, 비활성화, 삭제 등 가능

    - + 버튼(또는 소스 코드 줄 번호에서 오른쪽 마우스 클릭 후, Add conditional breakpoint)을 통해 조건부 디버깅 가능

        - 표현식이 참인 경우에만 실행 중지

 

cf. 소스 코드 줄 번호에서 오른쪽 마우스 클릭 후, Continue to here

    - 중단점을 설정하기는 귀찮은데 해당 줄에서 실행을 재개하고 싶을 때 사용

1
2
3
4
5
6
7
8
function hello(name) {
  let phrase = `Hello, ${name}!`;
 
  debugger;  // <-- 여기서 실행이 멈춥니다.
 
  say(phrase);
}
 
 

* debugger 작성을 통한, breakpoint 설정

 

* F5를 통해 중단점 실행

 

* watch: +를 클릭해 원하는 표현식을 입력한 후 Enter를 누르면 중단 시점의 값 반환

 

* Call Stack: 실행 경로를 역순으로 표시

* Scope: 현재 정의된 모든 변수 출력

    - Local: 지역 변수

    - Global: 전역 변수

 

1. Resume: 스크립트 실행을 다시 시작 (F8)

2. Step over: 다음 명령어를 실행하되, 함수 안으로 들어가진 않음 (F10)

3. Step Into: 비동기 동작을 담당하는 코드로 진입하고, 필요하다면 비동기 동작이 완료될 때까지 대기 (F11)

4. Step Out: 실행 중인 함수의 실행이 끝날 때 까지 실행을 계속 (Shift + F11)

    - 내부 동작을 알고 싶지 않은 중첩 함수로 진입했거나 가능한 한 빨리 함수 실행을 끝내고 싶은 경우

5.  모든 중단점을 활성화/비활성화

 

 


5. 테스트 자동화와 Mocha

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
<!DOCTYPE html>
<html lang="en">
 
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
 
    <!-- Mocha CSS: mocha 결과 출력용 CSS -->
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/mocha/3.2.0/mocha.css">
    <!-- Mocha Code -->
    <script src="https://cdnjs.cloudflare.com/ajax/libs/mocha/3.2.0/mocha.js"></script>
    <script>
        mocha.setup('bdd'); // 기본 셋업
    </script>
 
    <!-- Chai Code -->
    <script src="https://cdnjs.cloudflare.com/ajax/libs/chai/3.5.0/chai.js"></script>
    <script>
        // assert 전역 설정
        let assert = chai.assert;
    </script>
</head>
 
<body>
 
    <script>
        function pow(x, n) {
            /* 코드를 여기에 작성합니다. */
 
            if (n < 0return NaN;
            if (Math.round(n) != n) return NaN;
 
            let result = 1;
            for (let i = 0; i < n; i++) {
                result *= x;
            }
            return result;
        }
    </script>
 
    <!-- 테스트(describe, it...)가 있는 스크립트 삽입 -->
    <script src="test.js"></script>
 
    <!-- 테스트 결과를 id가 "mocha"인 요소에 출력-->
    <div id="mocha"></div>
 
    <!-- 테스트를 실행 -->
    <script>
        mocha.run();
    </script>
 
</body>
 
</html>
 
 

Mocha를 활용한 Test 준비

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
describe("pow"function () {
  describe("x를 세 번 곱합니다."function () {
    function makeTest(x) {
      let expected = x * x * x;
      it(`${x}을/를 세 번 곱하면 ${expected}입니다.`, function () {
        assert.equal(pow(x, 3), expected);
      });
    }
 
    for (let x = 1; x <= 5; x++) {
      makeTest(x);
    }
  });
});
 
 

* 중첩 describe를 통한 테스트 그룹화

* describe("title", function() { ... })
    - title: 구현하고자 하는 기능에 대한 설명

    - function: title과 관련된 it 블럭 그룹화

* it("유스 케이스 설명", function() { ... })
    - it의 첫 번째 인수: 특정 유스 케이스에 대한 설명

    - it의 두 번째 인수: 유스 케이스 테스트 함수
* assert.equal(value1, value2)
    - value1(테스트 함수 결과값)과 value2(기대값)가 동일한지 비교

 

1
2
3
4
5
6
7
8
9
10
11
12
13
describe("test"function() {
 
  before(() => alert("테스트를 시작합니다 - 테스트가 시작되기 전"));
  after(() => alert("테스트를 종료합니다 - 테스트가 종료된 후"));
 
  beforeEach(() => alert("단일 테스트를 시작합니다 - 각 테스트 시작 전"));
  afterEach(() => alert("단일 테스트를 종료합니다 - 각 테스트 종료 후"));
 
  it('test 1', () => alert(1));
  it('test 2', () => alert(2));
 
});
 
 

* 초기화 용도로 사용

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
describe("pow"function() {
 
  // ...
 
  it("n이 음수일 때 결과는 NaN입니다."function() {
    assert.isNaN(pow(2-1));
  });
 
  it("n이 정수가 아닐 때 결과는 NaN입니다."function() {
    assert.isNaN(pow(21.5));
  });
 
});
 
 

* 예외적 상황에 대한 test code 추가

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
describe("주어진 숫자의 n 제곱"function() {
  it("5를 1 제곱하면 5"function() {
    assert.equal(pow(51), 5);
  });
 
  // Mocha는 only 블록만 실행
  it.only("5를 2 제곱하면 25"function() {
    assert.equal(pow(52), 25);
  });
 
  it("5를 3 제곱하면 125"function() {
    assert.equal(pow(53), 125);
  });
});
 
 

* test case는 it블럭으로 모두 구분하여 확인

* it.only

    - 해당 it 블럭만 수행