[EggChatter] 테스트코드 실행문 스크립트 파일로 간소화하기

예전에 회사에서 버전 브랜치를 실제 서비스에 배포할 때, 스크립트 파일을 이용해서 굉장히 편하게 배포한 적이 있다. 4개국을 서비스하고 있었으며, 국가 당 12종류의 서비스 서버가 존재했기 때문에 버전브랜치를 명령어 일일이 작성해서 배포하는 일은 헷갈려서 휴먼에러가 발생할 수도 있었고, 48번의 명령어를 입력하는 게 여간 귀찮은 일이 아니였다.
이런 문제 때문에 배포용 스크립트 파일이 있었다.
국가와 서비스에 대한 옵션값을 받아서 한 번의 명령어로 모든 서비스를 배포하거나, 일부만 배포할 수 있었다.
이 이야기를 하는 이유는, 실행 명령어를 일일이 작성하는 게 썩 귀찮은 일이며 미미한 오탈자에도 취약하다고 생각했기 때문이다. 그래서 테스트 코드를 더 편리하게 실행할 수 있는 스크립트 파일을 만들어 사용하려고 한다.
원하는 명령어 형태
./{스크립트 명}.sh -s {소스코드 파일명} -f {함수 alias}
최대한 공통적인 부분을 배제하고 동적으로 처리할 수 있는 부분만 명령어에 남기고 싶었다.
함수명도 좀 길게 짓다보니..alias로 처리될 수 있게끔 하고자 한다.
스크립트 파일 생성
t.sh 파일을 생성해주었고, 아래와 같이 해당 파일에 실행권한을 부여했다.
chmod +x t.sh
스크립트 문
#!/bin/bash -e
tcps="test_create_profile_success"
tcpf="test_create_profile_failure"
_usage() {
echo "Usage: $0 -s <test_file> -f <test_function_alias>"
echo "Example: $0 -s users -f tcps"
exit 1
}
while getopts "s:f:" opt; do
case ${opt} in
s)
TEST_FILE=$OPTARG
;;
f)
TEST_FUNCTION_ALIAS=$OPTARG
;;
*)
_usage
;;
esac
done
if [[ -z "$TEST_FILE" || -z "$TEST_FUNCTION_ALIAS" ]]; then
_usage
fi
TEST_FUNCTION=${!TEST_FUNCTION_ALIAS}
if [[ -z "$TEST_FUNCTION" ]]; then
echo "Invalid function alias: $TEST_FUNCTION_ALIAS"
exit 1
fi
pytest "app/tests/test_${TEST_FILE}.py::$TEST_FUNCTION"
1. #!/bin/bash -e
- bash쉘을 사용하도록 했다.
- -e 옵션을 추가한 이유는, 명령어 실행 중 오류가 있을 경우에 즉시 종료 될 수 있게 하기 위함이다.
2. 함수 alias 정의
- 함수 별로 "_"를 구분자일때, 구분자 기분으로 나누어진 단어의 첫 번째 글자를 따와서 alias를 생성했다. (
나중에 겹치는 게 있을까봐 살짝 걱정되긴한다...일단 버전 1이니까 해보고 별로면 변경하면된다.)
3. _usage()
- 이거는 명령어를 잘못 쳤었을 때, 안내 메세지를 나타내주기 위한 scope다.
- 스크립트가 잘못 사용됐을 때는 exit1을 통해 종료하고, 실행방법을 안내해준다.
아래처럼 ./t.sh 라고 실행파일만 명령어로 치면, 즉시 실행종료하고 올바른 실행방법을 안내해주는 것을 볼 수 있다.

4. while getopts "s:f:" opt; do
- getops는 옵션값을 파싱하여, -s로는 테스트 파일명을, -f는 테스트 함수의 alias를 받는다.
- TEST_FILE=$OPTARG는 -s 옵션에서 입력된 값을 TEST_FILE 변수에 저장하고, TEST_FUNCTION_ALIAS=$OPTARG는 -f 옵션에서 입력된 별칭을 TEST_FUNCTION_ALIAS에 저장한다.
- *)는 잘못된 옵션을 입력했을 때, _usage()함수를 호출한다.
5. if [[ -z "$TEST_FILE" || -z "$TEST_FUNCTION_ALIAS" ]]; then _usage ...
- 인자값 받아서 처리하는 부분이다.
- TEST_FILE이나 TEST_FUNCTION_ALIAS가 빈 값이면, _usage() 함수를 호출한다.
6. TEST_FUNCTION=${!TEST_FUNCTION_ALIAS}
- 별칭으로 실제 함수명을 가져오는 부분이다.
7. if [[ -z "$TEST_FUNCTION" ]]; then
- 유효한 함수 별칭이 아닐 경우 처리하는 부분인다.
8. pytest "app/tests/test_${TEST_FILE}.py::$TEST_FUNCTION" 📍
- 여기가 실제로 pytest 명령을 실행하는 부분이다.
실행 화면
