오늘 배운 것

어제 알람 기능 로직을 작성하다 엔드투엔드(e2e) 테스트의 필요성을 많이 느꼈고, 그래서 시간이 좀 걸리더라도 e2e 테스트를 도입하는 것이 맞다는 판단이 들었다. 왜냐하면 앞으로 알람 기능 뿐만 아니라 다른 기능(API 테스트는 물론이고, 롱 폴링이나 웹소켓 등을 도입하게 되는 경우)을 사용할 때도 e2e는 유용하게 사용될 것이었기 때문이다.

 

그렇다면 e2e를 도입해 보고, 해당 이슈를 우선 처리한 다음, 도입한 e2e로 알람 기능을 테스트 및 개선해 보자. 

 

RN에서는 JestDetox, Django에서는 기존의 pytest를 그대로 사용한 다음, Detox를 통해 이 둘을 연결할 수 있을 것으로 보였다. 

npm install detox --save-dev
npm install jest --save-dev
detox init

 

detox에서는 jest와 같이 사용하는 것을 지원한다고 했다. 그래서 'detox init'을 통해 생성된 'e2e/jest.config.js'라는 파일에서 관련 설정을 관리하는 것으로 보였다. 해당 프로젝트 가이드를 보고 따라한 뒤, build 명령어를 실행시켜 주었다. 

detox build --configuration android.emu.debug

 

그런데 프로젝트 가이드를 보면서 작성한 DetoxTest.java 파일에서 에러가 났다. 'detox build' 명령어로 테스트를 테스트하려면 더미 테스트 파일이 있어야 한다고 해서 만든 파일인데, 여기서 존재하지 않는 패키지를 import 하려고 시도해서 에러가 난 것 같았다. 일단 가이드를 그대로 따라 해봤는데 'com.wix.detox' 파일을 찾을 수 없다고 하니 두 가지 가능성이 있었다. 우선 Detox나 관련 설정이 제대로 되어있지 않거나, 아니면 내가 읽은 가이드는 React Native, 기본으로는 React Native CLI를 전제로 한 가이드인데 Expo를 사용할 경우 설정이 달라졌을 수도 있다. 

우선은 오류가 났을 때 첫 번째 가능성을 먼저 보기로 했다. 왜냐하면 Detox에 나와있는 'expo를 사용하는 경우'에 대한 가이드를 봤는데 detox를 사용하는 게 아니라 maestro라는 또 다른 툴을 사용하는 것으로 보였다. 나는 일단 detox를 1시간 이상 보기도 했고, 일단은 이 툴을 사용해보고 싶었기 때문에 환경설정이 제대로 안 되어있을 가능성을 보기로 했다. 

 

우선 android>app>build.gradle 파일에서 다음과 같이 설정해 주자. 

androidTestImplementation 'com.wix:detox:+'
androidTestImplementation 'androidx.test.ext:junit:1.1.2'
androidTestImplementation 'androidx.test:runner:1.3.0'
androidTestImplementation 'androidx.test:rules:1.3.0'

 

그리고 android>build.gradle 파일에서는 다음과 같이 설정해 주자. 

buildscript {
    dependencies {
        classpath 'com.wix:detox-gradle-plugin:1.22.0' // 최신 버전으로 설정
    }
}

 

이렇게 설정해 주어도 계속 오류가 났다. 위의 buildscript>dependencies>classpath에서 설정한 값과 맞는 파일이나 자료를 찾을 수 없어서 dependencies를 해결할 수 없다는 오류가 나는 것으로 이해했다. 

 

그렇다면 여기서 에러를 계속 디버깅하는 것이 맞을까, 아니면 expo 환경에서 사용할 수 있는 다른 라이브러리나 다른 방법을 찾아보는 게 맞을까? 나는 후자가 맞다고 생각했다.

공식문서를 잘 보자!

해당 가이드를 보니 Expo를 사용하는 경우 Maestro라는 라이브러리, 툴을 사용할 것을 권장하고 있었다. 사실 좀 걸리는 부분이 있는 게, 멘토님께서도 eas build 때문에만 expo를 사용하는 거라면 우리 프로젝트에 꼭 expo가 필요한 것은 아니며, 오히려 이 dependency를 없애는 게 나중에 다른 라이브러리나 툴을 더 쉽게 도입할 수 있고 디버깅도 쉬울 거라고 말해주셨기 때문이다. 지금 그 말을 여실히 체감하고 있다. 

 

maestro를 사용하면 장단점이 있다. 우선 yaml 파일을 통해 테스트 코드를 작성해서 간단하고, expo와 호환된다는 장점이 있다. 그러나 구체적인 테스트 시나리오를 작성할 수 없으며 기능이 제한적이라는 점이 걸렸다. 

 

알고보니 RN에서 expo를 사용해서 detox로 e2e 테스트를 하는 방법이 문서로 정리되어 있지만 deprecated 된 상태였다. 그래서 이것을 사용해야 할지 말지가 심히 고민된다.

 

그런데 생각해보니 테스트 라이브러리를 꼭 지금 정하면 바꿔야 하는 것도 아니었다... 일단은 maestro를 사용하고, 만약 기능이 제한적이라고 느껴지거나 나중에 expo dependency를 제거하게 되면 그때 detox로 바꿔도 될 것 같다. 일단 maestro를 사용해 보자. 

 

그러려면 우선 기존에 detox를 도입하기 위해 코드를 바꿔놓은 부분을 원복 해야했다. 이게 git restore . 를 하면 바로 되는 게 아닌게 /android 폴더는 .gitignore에 있는 상태였기 때문에 일일이 코드를 바꿔줘야 했다...! 다행히 관련 문서가 있었다. 알고보니 명령어 하나로 해결되는 문제였다. 

detox clean-framework-cache

 

npm dependency도 제거해 주었다.

npm uninstall detox-cli --global
npm uninstall detox

이제 maestro를 사용해 보자. 가이드에 따르면 프로젝트 루트 디렉토리에 'maestro' 폴더를 만들면 해당 폴더 아래의 .yaml 파일들을 참조하는 것 같았다. 

 

그런데 maestro를 사용하면 제약이 많았다. 우선 npm으로 설치가 안 되어서 전용 CLI를 사용해야 했고, 'maestro init'을 실행했는데 되지가 않았다. 벌써부터 많은 것들이 되어있지 않다고 느껴져서, 이걸 계속 사용해야 할지 모르겠었다. 그래서 멘토님께 도움을 요청해 보았다. 멘토님께서는 react native testing library를 추천해 주셨다. 이거는 엔드투엔드(e2e) 테스트는 아니지만 통합 테스트 툴이다. 

 

그러다가 멘토님과 현재 개발 진행상황에 있어서 궁금한 점과 조언이 필요한 점에 대해서 멘토링을 했는데, 또 다른 인사이트를 얻을 수 있었다. 해당 부분은 별도의 포스트로 올려보겠다. 결론은 지금 하고 있는 알람 기능이 중요한 게 아니라, 다른 팀원이 하고 있었던 앱 배포에 모든 팀원이 뛰어들어서 한시라도 빨리 배포를 마쳐야 한다는 것이었다. 

 

 궁금한 점

1. graybox testing의 정확한 개념이 무엇인지 궁금하다. 

2. build.gradle 파일이 groovy라는 언어로 되어있는 줄은 알았는데 새삼 이 친구에 대해서 하나도 궁금해하지 않았구나 싶었다. groovy는 주로 어떤 개발에 사용하는 녀석일까?

3. android>build.gradle 파일과 android>app>build.gradle 파일의 설정은 뭐가 다를까? 왜 별도의 build.gradle 파일이 필요할까?

 

+ Recent posts