brunch

You can make anything
by writing

C.S.Lewis

by 이지원 Oct 01. 2022

특정 시나리오에 대해서만 특정 후크를 실행하는 방법

E2E 테스트 자동화 실무를 진행하다 보면 특정 시나리오 테스트 종료 후 특정 시나리오에만 after 후크 처리를 해주고 싶은 상황이 생기는데요. 테스트 자동화 설계 단계부터 다양한 예외 상황을 고려해서 작업한 게 아닌지라 예상치 못한 상황들이 생기곤 했습니다.


클래스팅 모바일 자동화 진행 간에 에뮬레이터 환경에서 이전 로그인 정보가 남아있어, 테스트 시나리오 의존성이 생긴 문제를, Cucumber의 Conditional hook를 활용해서 해결한 경험을 공유합니다.


Background

테스트 환경은 에뮬레이터입니다. 테스트 프레임워크는 WebdriverIO, Appium, BDD 프레임워크는 Cucumber를 사용 중입니다. 프로그래밍 언어는 자바스크립트입니다. 소셜 로그인 Feature 대한 4개 시나리오를 자동화시키기 위해 E2E 테스트 코드를 작성했습니다.


예시의 BDD 시나리오는 E2E 테스트 자동화 및 BDD 프레임워크를 고려하지 않은 상태에서 작성된 시나리오인지라 Cucumber의 BDD 철학에 적합하지 않은 단계들이 존재합니다. 또한 아직 테스트 코드 리팩토링 하지 않았습니다. 테스트 자동화에서 공통적으로 사용되는 행동들을 정의하고 재사용성을 높이면 코드가 훨씬 간결해질 것 같고, Cucumber에서 제공하는 다양한 기능들을 사용하면 보다 읽기 쉽고 확장성 있는 구조가 만들어질 것 같습니다. 예시 코드는 좋은 코드가 아님을 참고 부탁드립니다.


당면한 문제

에뮬레이터에서 카카오 로그인을 진행하고 나면 실행된 에뮬레이터 기기에 이전 로그인 정보가 남아있어, 카카오 로그인 관련 시나리오에서 의존성 문제가 발생하게 되었습니다. 좋은 방법은 아니지만 빠른 구현을 위해 테스트 전/후처리를 before와 after로만 진행하고 있는 상황이었는데, 이전 로그인 정보가 남아있다 보니 카카오 로그인 시나리오가 실행되기 전, 카카오 로그인 시나리오를 진행하는 테스트 데이터로 로그인 후 로그아웃이 필요했습니다.


문제는 특정 시나리오에서만 해당 후크가 동작할 수 있는 테스트 조건이 갖춰졌기 때문에 단순히 after로 전체 시나리오에 대한 테스트 후처리를 할 수 없는 상황이었습니다.


해결 과정

설계를 처음부터 다시 할까 생각도 해봤지만 작업을 빠르게 마무리하는 게 우선인지라 적합하지 않은 방법이었습니다. 그러던 문득 특정 시나리오에 대한 테스트 전/후처리를 할 수 있는 방법이 존재할 거라 생각했습니다. 왜냐하면 특정 시나리오에 대한 처리는 아주 잠깐만 생각해보아도 실무 레벨에서 충분히 요구될 수 있는 사항이었습니다. Cucumber를 오래 다뤄본 건 아니지만 상식적인 수준에서의 충분히 있을법한 기능이었습니다.


Cucumber 공식 문서를 다시 살펴봤고 역시나 해결 방법이 존재했습니다. 이러한 문제를 해결하기 위해 만들어진 기능인지는 잘 모르겠지만 우선 실무에서 주어진 요구사항을 해결하기 위한 적절한 방법이었습니다. 

https://cucumber.io/docs/cucumber/api/#steps

테스트 시나리오 의존성을 제거하기 위해 @androidApp 태그가 달린 시나리오에서는 MyScreen에 정의된 proceedLogout() 메서드를 실행하여 after 후크에서 로그아웃 처리를 해줬습니다. 디바이스마다 로그아웃 버튼 위치 좌표가 다를 수 있기 때문에 로그아웃 버튼이 보일 때까지 스크롤하는 기능을 추가했습니다.

@androidAppSocialAfterHookException 태그가 달린 시나리오에서는 카카오 로그인 시나리오를 진행하는 테스트 데이터로 로그인 후 로그아웃 시키는 로직을 작성했습니다.


이로써 에뮬레이터에서 카카오 로그인 진행하면 실행된 에뮬레이터 기기에 이전 로그인 정보가 남아있어 발생한 카카오 로그인 관련 시나리오 의존성 문제를 해결하게 되었습니다.


추후 리팩토링 진행 시 더 좋은 해결방안이 분명 있을 것 같습니다. 다만 중요한 건 지금 해결한 방법은 결과적으로 Cucumber 기능을 사용했기 때문에 Cucumber 프레임워크를 의존하는 형태가 되었습니다. 추후 리팩토링을 하게 된다면 좋은 설계(?)를 통해 특정 프레임워크에 의존하지 않고도 해결할 수 있는 방법을 찾아봐야겠습니다.

매거진의 이전글 WebdriverIO에서 Pytest 전환 후기
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari