소프트웨어 변경 - 3

2022/02/11
Software Engineering

테스트 도구

레거시를 업데이트 하는 과정에서 필요한 도구를 정리해보겠습니다.

리팩토링 자동화 도구

새로운 구조로 변경하기 위해 리팩토링을 진행하는 과정에서 이를 지원하는 툴을 가지고 작업을 한다면 많은 도움이 됩니다.
1990년대에 빌 옵다이크가 학위 논문을 위해 C++ 리팩토링 도구를 작성했습니다. 상용도구로 발표되지는 않았지만 이후 다양한 언어의 리팩토링 도구에서 많은 영향을 끼쳤습니다.

마틴 파울러는 Refactoring: Improving the Design of Existing Code 에서 다음과 같이 정의했습니다.

소프트웨어의 기존 동작을 변경하지 않으면서, 이해 및 변경이 용이하도록 소프트웨어의 내부구조를 변경하는 작업

리팩토링은 코드의 변경 후 기존 동작과 동일하게 작동해야 합니다. 그래서 항상 리팩토링에는 이를 검증하는 작업역시 필요합니다.
실제로 많은 툴들이 검증과정을 거치지만 일부 도구의 경우 이러한 검증을 수행하지 않는 경우가 있어 버그가 생길 수도 있습니다.

따라서 툴을 선정하는데에 고려할 필요가 있으며, 리팩토링를 하기전에 테스트코드를 통해 해당 코드를 감싸는 것이 좋습니다.

Mock 객체

레거시 코드에서 가장큰 문제는 의존관계입니다. 다른 코드를 제거하고 특정코드를 제대로 테스트 하려면 그 다른 코드를 제거한 상태로 특정 코들르 제대로 테스트 하려면 그 다른 코드를 대신해서 올바른 값을 제공하는 또다른 코드가 필요합니다. 그리고 이를 mock 객체라고 합니다. 보통 자바에서는 Mockito, 코틀린에서는 mockk 이라는 라이브러리를 사용합니다.

단위 테스트

단위 테스트를 작성할 때 각 클래스에 대한 단위테스트 대신 GUI를 통해 테스트를 넓은 범위로 하고 싶은 경우가 있는데, 사실 이는 적합한 방법이 아닙니다. UI기반 테스트에서 실패 하는 경우에 정확한 위치를 찾기 어렵기 때문입니다. 따라서 각 코드 별로 단위테스트를 작성하는 것이 좋습니다.

xUnit

켄트 백이 스몰토크로 만든 것을 자바로 이식한 프레임워크입니다. xUnit 은 다음과 같은 특징을 가집니다.

  • 프로그래머는 현재 사용 중인 개발언어로 테스트 루틴을 작성할 수 있습니다.
  • 모든 테스트는 독립적으로 실행됩니다.
  • 테스트들을 그룹 단위로 묶어서 필요할 때마다 실행/재실행 할 수 있습니다.

xUnit은 대부분의 언어에서 지원하고 있고 단순한 구조로 큰 어려움 없이 테스트코드를 작성 할 수 있습니다.

jUnit

xUnit의 자바 버전으로 현재 5버전까지 나왔으며 어노테이션을 통해 테스트코드를 정의합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

public class TestCases {

@BeforeEach
void init() {
// do something
}

@AfterEach
void clear() {
// do something
}


@Test
void testIntPlus() {
assertEquals(1+1, 2);
}

}

메소드 앞에 @Test라는 어노테이션을 선언함으로써 메소드를 테스트 하네스로 선언합니다. 그리고 내부에는 assertEquals 라는 검증 함수가 있는데, 이는 jUnit에서 제공하는 assertion 함수 입니다. 실행된 메소드의 결과가 의도된 결과와 동일한지 검증하는 함수 입니다.

@BeforeEach, @AfterEach 가 붙은 함수는 테스트 시작 / 끝에서 처리할 작업을 정의하는 메소드 입니다.

일반적인 테스트 하네스

xUnit은 단위 테스트를 위한 프레임워크입니다. 좀 더 큰사이즈의 테스트를 위해서는 다른 툴을 사용하는 것이 좋습니다.

FIT

FIT (Framework for Integrated Test) 이름그대로 Integration 테스트를 위한 프레임워크로 시스템과 관련된 문서를 작성하고 문서내에 입력/출력값을 기술한 테이블을 HTML 문서로 정의하여 저장합니다. FIT 은 이 문서를 테스트 루틴으로 실행합니다. FIT의 장점은 하나는 소프트웨어를 작성하는 사람과 요구사항을 명시한 사람 간의 커뮤니케이션이 쉽다는 점입니다. 처음에는 테스트 루틴에 문서화만 해놓은 상태에서 점점 기능을 추가하면서 테스트를 통과시키는 방향으로 코드를 작성하게 됩니다.

Fitnesse

Fitnesse 는 위키상에 구축된 Fit 을 말합니다. Fit 테스트를 정의한 계층적인 웹페이지를 지원하고 테스트용 테이블은 개별적으로 실행될 수도 있고, 한꺼번에 실행하게 할 수 있습니다.


출처
이 글은 레거시 활용 전략의 5장의 내용을 읽고 제 나름대로 재구성했습니다.