programming4 MIN READ

[소프트웨어 테스트] 09. 대규모 테스트 작성

[소프트웨어 테스트] 09. 대규모 테스트 작성

소프트웨어 테스트 시리즈의 글입니다.

대규모테스트는 언제 작성해야할까? 어떻게 작성할수있을까?

9.1 대규모 테스트 사용 시기

  • 전체 동작이 여러 클래스로 구성되어 있어 함께 구동될 때 어떤 일이 일어나는지 확인하고 싶은 경우
  • 테스트하려는 클래스가 거대한 플러그 앤 플레이 아키텍처의 구성요소일 때. 위 두 경우를 일반화해보자.

9.1.1 거대 구성요소에 대한 테스트

  • 각각의 규칙은 자신의 클래스를 가져야 함
  • 명세기반 테스트, 경계테스트 적용
  • 구조적으로 모든것을 단위테스트로 검사하고도 의심이 드는 경우 모든 클래스가 함께 구동되는 대규모 테스트 작성
  • 팩토리 클래스(모든 의존성을 지닌 클래스) 활용
  • 상용버전에서 발생하는 문제를 디버깅 할 때 유용하다고 생각되면 사용함.
  • 단위테스트는 필수, 대규모테스트는 거기에 더해서 활용.

9.1.2 코드베이스 범위보다 큰 거대 구송요소 테스트

단위를 격리해서 테스트 할 수 없는 경우?

  • CK테스트 (자바코드에 대한 코드메트릭 계산 툴) : 직접 실제 자바클래스를 만들어 통합테스트를 수행
  • 앤디 테스트 (학생들의 작성한 테스트 스위트 평가 툴) : 코드 컴파일 및 엔진을 구동하는 대규모 테스트 수행

9.2 DB와 SQL 테스트

DAO는 데이터베이스의 정보를 검색하거나 영속화 하는 역할을 함. 이걸 테스트하려면?

9.2.1 SQL 쿼리 테스트

  • 명세 기반 테스트 : SQL이 요구사항을 벗어나는 경우 이를 분석하고 테스트
  • 경계 분석 : SQL이 가지는 경계를 테스트
  • 구조적 테스트 : SQL쿼리의 구조를 사용해 테스트케이스 도출 구조적테스트에 조금 더 초점을 맞춤.
  • 분기 커버리지
  • 조건+분기 커버리지 혹은 아래 다섯가지 지침을 참고하자
  • SQL조건문을 위한 MC/DC 적용
  • 널 처리를 위한 MC/DC 적용
  • 선택한 데이터에 대한 범주-구획 처리
  • 출력값 검사 : 특정칼럼의 값으로 null 혹은 빈값을 반환할수있으므로…
  • 데이터베이스 제약사항 검사 ex. unique constraint

9.2.2 SQL 쿼리에 대한 자동 테스트

  1. 데이터베이스 연결 설정
  2. 데이터베이스 초기값 설정
  3. SQL쿼리 수행
  4. 출력 검사

9.2.3 SQL테스트를 위한 인프라 설정

db스키마가 복잡해진다면 이를 보조하는 인프라에 투자하는것을 두려워 말자 필자는 통합테스트를 위한 부모클래스만드는 방식을 추천함. 부모테스트들은 아래와 같은 작업들을 포함함

  • db연결 열기
  • transaction 열고 commit
  • db상태 재설정
  • 테스트 코드 양을 줄여주는 도우미 메서드

9.2.4 모범 사례

  • 테스트 데이터 생성기 사용
  • 단언api 잘만들어서 재활용
  • 필요한데이터 최소화
  • 스키마의 변화 고려
  • 인메모리 db 고려

9.3 시스템 테스트

웹애플리케이션을 만들때 무엇을 테스트해야할지 알아보자 브라우저를 열고 웹페이지와 상호작용할수있는 도구도 살펴보자

9.3.1 selenium

셀레니움 : 웹앱 테스트를 지원하는 유명한 툴 브라우저를 연결하고 다룰 수 있음

9.3.2 페이지 객체 모델링

시스템 테스트 : 시스템의 한 단위가 아니라 전체를 테스트 모든 구성요소가 함께 작동하고 경로가 많은 웹 앱은 어케 테스트를 할까? → user jorney test 일반 사용자가 시스템을 돌아다니는 과정을 시뮬레이션하자. PO(Page Object:페이지 객체)를 사용한다.

9.3.3 패턴과 모범사례

  • 웹 테스트에 필요한 상태로 시스템을 설정할 수 있는 방법 제공 (ex. api호출)
  • 각 테스트가 항상 깨끗한 환경에서 실행되는지 확인 (ex. db초기화, backdoor제공)
  • html요소에 의미있는 이름 지정
  • 여정 테스트의 경우에만 여정의 모든 단계 방문
  • 단언문은 PO에서 가져온 데이터 사용
  • 테스트 스위트에 중요한 설정값을 전달
  • 여러 브라우저에서 테스트 수행 (CI도구, sourcelabs등 툴 활용)

9.4 마지막 논의

대규모 테스트에 대한 마지막 논의

9.4.1 테스트 수준

테스트 수준, 규모는 상관없이 좋은 테스트 케이스를 만드는것이 중요 모든것을 단위수준에서 수행하고 대규모테스트에서는 가장 중요한 행위를 수행

9.4.2 비용/이득 분석 수행

좋은 테스트는 작성비용은 적게들면서 중요한 버그는 잡는 테스트 대규모테스트는 작성, 실행, 유지보수 비용이 적지않음 간단한 비용/이득 분석 수행은 따라서 기본임. → 이 테스트가 필수인가? 대다수는 ‘테스트는 반드시 작성해야 한다’ 겠지만.. 비용이 너무 크다면 테스트 단순화 방법을 고려해보자.

9.4.3 수행은 되었지만 테스트되지 않은 메서드 조심

대규모테스트에서는 어떤 메서드를 수행하지만 테스트는 안할 가능성이 높음 따라서 단위테스트 기본 + 대규모테스트 추가 하는 방법을 추천!!

9.4.4 적합한 코드 인프라

통테, 시테 모두 배후에 적절한 인프라 필요 테스트 인프라에 투자하는것을 두려워말자

9.4.5 DSL, 테스트작성자를 위한 도구

robotframework 나 cucumber같은거 쓰면 자연스러운 언어로 테스트 작성도 가능!!

9.4.6 다른 종류의 웹 시스템에 대한 테스트

해당 커뮤니티에서 테스트에대한 내용을 참고하자