테스트 자동화로 PS5 예약하기

YI Eun Gook
4 min readApr 29, 2021

--

성공했습니다 -_-v

참고: 이 글은 jest, puppeteer, crontab, shell, desktop notification을 가볍게 다루고 있습니다.

PreOrders에 가끔씩 취소 물량이 뜬다고 합니다.

http://preorders.kr/product/store-list?id=99

품절대신 품절임박이라고 뜨면 그 때 예약할 수 있다고 합니다. 이건 자동화 해야겠다 라고 생각했습니다.

jest, puppeteer, jest-puppeteer를 준비하고 1) 문서2) 참고하여 테스트 코드를 호다닥 작성해 봅니다.

describe('preorders', () => {
it('renders correctly', async () => {
const p = await page.goto('http://preorders.kr/product/store-list?id=99');
const text = await p.text();
expect(text).toMatchSnapshot();
});
});

yarn test

오, 잘 동작합니다! (에러.. 즉 품절임박은 아직 안 떴지만 T_T)
그럼 이걸 자동으로 반복 실행되게 하고 싶었습니다.
이건 파일의 변화와 관계없이 반복 실행되어야 하니까.. cron을 써봐야겠다고 생각했습니다. 쉘 스크립트를 작성해 봤습니다.

cron에서 node 실행하기

여기서 정말 많이 해맸습니다. 😭

먼저 cron은 macOS의 기본 쉘과 환경을 공유하지 않습니다.
하여 스크립트를 작성할 때 제일 먼저 node를 위한 환경을 가져옵시다.

export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm

하지만 yarn test로 간단히 실행되지 않습니다.
yarn의 경로도 필요하고, yarn을 실행할 경로도 필요합니다.
/usr/local/bin/yarn --cwd ~/code/ps5-reservation-test-01 test

그리고 이렇게 만든 test.sh에는 chmod로 실행 권한을 줘야 합니다.
chmod +x test.sh

잘 됐습니다! 마지막으로 제 컴퓨터인 macOS에 데스크탑 알림을 주면 될 것 같습니다. 터미널 계속 볼 수 없으니까!

macOS에 데스크탑 알림 주기

사실 jest는 기본적으로 데스크탑 알림을 지원합니다. 하지만 jest에서 사용하는 구현체 node-notifier는 cron에서의 동작을 지원하지 않았습니다.

😢😢😥😢

대신 jest의 실행 결과를(stdout, stderr) 받아서, 에러가 발생할 경우 쉘에서 직접 데스크탑 알림을 주면 될 것 같았습니다. 하지만 jest는 왜인지--useStderr옵션과 무관하게 성공시에도 stderr로 결과를 주고 있었습니다. 😇😇😇

Jest is using stderr as output #5064

다행히 jest-standard-reporter를 통해서 해결했고, 3>&1 1>&2 2>&3으로 stderr를 받아서 그 길이0보다 크다면을 통해 구현했습니다! (만세!)

export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm
test=$(/usr/local/bin/yarn --cwd ~/code/ps5-reservation-test-01 test 3>&1 1>&2 2>&3)
length=${#test}
if [ $length -gt 0 ]
then
/usr/bin/osascript -e 'display notification "'"${test//\"/\\\"}"'" with title "ps5-reservation-test-01"'
fi

결과

아자뵹~

예약에 성공했고, 입금 시간을 놓쳐서(?) 취소된 이후 (맙소사) 운이 좋아 고마운 분에게 정가에 양도받을 수 있었습니다. 이제 제게는 PS5와 이 글이 생겼습니다! 해피 엔딩, 해피 엔딩!

--

--

No responses yet