Selenium 사용법은 어느정도 익숙해지고 있으나, 어떻게 해야 '잘' 쓸 수 있을까? 궁금증이 생겼고, 꼭 이래야만 한다. 라고 정해진 것은 아니지만 코드 작성하며 알아두면 좋을 내용을 포스팅한다.
알아둘 것
- sleep call: call 하는 상황은 다양하지만 매번 동작한다고 보장할 수 없다.
만약, Web 테스트 시 특정 element가 로드까지 시간이 오랜 걸려서 sleep을 주면 sleep 시간만큼 cycle이 증가하고, UI 자동화 시 안정성이 떨어진다.
→Implicit wait, Explicit wait을 사용하자
둘 다 모두 wait time 이전에 정상적으로 실행이 되면 다음 line을 수행한다. 완료에 관계없이 wait time이 지나가면 다음 line를 수행한다.
*implicit_wait: load가 정상적으로 안될 때 최대 wait time.
*explicit_wait: 웹 전체가 다 랜더링 되는 것을 기다려야 하는 상황인데 스크립트가 랜더링 되기 전에 실행되면 케이스 돌렸을 때 무조건 에러난다.. 그래서 특정 상황을 만족할 때까지는 기다리라고 명시적으로 적는다.
WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "idname")))
실제 경험담
테스트 서버가 정말 구렸고, 테스트 조건에 따라 화면에 랜더링해야하는 부분에 쿼리문 속도가 wait 시간을 넘어가서 implicit 알기 전에는 시간 맞추느라 애먹었다.
- Test suite과 case 네이밍
suite과 case name을 잠깐 보고서 어느 기능에서 문제가 발생했는 지 파악할 수 있어야 한다. 본인과 팀원을 위해서!
- Zoom 100%
Zoom 100%는 실수하기 쉽다. 100%가 아니면 element 위치가 달라지고 상황마다 다르겠지만, UI 자동화 시에는 무조건 에러 뿜뿜일 것이다.
또한, 크로스 브라우징 환경에서는 Zoom 이외에도 보안 설정을 잘해줘야 한다. 화면이 안 넘어가서 exception을 볼 수 있을 것이다.
- URL이 로드될 때 브라우저 크기를 최대화하라
Selenium은 디폴트로 최대화하지 않는다. 스크린샷 혹은 레코딩을 하는 경우 최대화 설정하여 문제를 감지할 수 있도록 하자
- 적합한 locator 선택 방법을 계속 고민하자
css, dom, xpath 등 선택자는 변경사항이 있을 때 자주 수정이 필요한 부분이다. 따라서, 변경사항에 덜 민감할 수 있는 locator를 고민하자.
일반적으로 Dynamic page에서는 link-text가 선호된다. Id > Name > CSSSelector > XPath 순으로 이상적이지만 규모가 커질수록, 프레임워크에 따라, 개발자에 따라 절대 그렇게 친절해질 수 없다.
또한, 크로스 브라우징 테스트 시 Xpath는 브라우저 엔진에 따라 동작 안 할 수도 있고, 속도가 느리기도 하므로 주의해야 한다.그러기 위해선 html과 javascript를 공부해야한다.
- 크로스브라우징 테스트를 위해서 호환성 매트릭스를 만들자
browser, os, device + version 조합에 따라 우선순위를 정할 수 있고 matrix로 작성해두자. 이는 제품 분석, geolocation, 세부 인사이트를 알 수 있다. 아래의 샘플을 참고해보자.

- 로깅 및 리포트 구현
test suite이 광범위한 경우 특정 테스트가 실패했을 때 실패 케이스를 찾는 것이 어려울 수 있다. 로깅과 리포트를 구현해둬서 빨리 찾을 수 있도록 하자.
- POM(Page object model)과 같은 디자인 패턴 및 원칙 사용
동일한 element가 쓰이고, UI가 자주 바뀌지 않을 때 유지보수, 확장성을 고려해야 한다. POM은 많이 사용되는 UI 자동화 패턴이며, 상세 내용은 공부해보자
- BDD 프레임워크 이용
BDD란 TDD에서 파생된 방법론으로 개발자와 비개발자의 협업 과정을 이끌어 낼 수 있으며, TDD는 add(1,1)이 2인지 확인. BDD는 사용자가 ‘=’ 눌렀을 때 1+1의 값이 2에 표시되는지 확인한다. BDD 작성 방법은 공부해서 별도의 포스팅으로 다뤄볼 예정.

- Src, Test 디렉토리 분리
일반적으로 소스 코드와 테스트 디렉토리가 존재하며, 테스트 코드 유지 보수를 위해 분리해두는 것이 좋다.

- Data driven testing 이용하자. 미리 정의된 입력&출력 set을 매개변수화 하자. 데이터를 테스트 로직에서 분리하여 아래와 같이 작성할 수 있다. 가독성과 커버리지가 늘어남을 알 수 있다.
"maximum of two numbers" {
Math.max(2, 3) shouldBe 3
Math.max(0, 0) shouldBe 0
Math.max(4, -1) shouldBe 4
Math.max(-2, -1) shouldBe -1
}
############################################################
"maximum of two numbers" {
table(
headers("a", "b", "max"),
row(2, 3, 3),
row(0, 0, 0),
row(4, -1, 4),
row(-2, -1, -1)
).forAll { a, b, max ->
Math.max(a, b) shouldBe max
}
}
- single driver를 사용하지 말자. 셀레니움 드라이버는 여러 웹과 OS를 지원한다.
chrome_driver = driver.Chrome(~~)
firefox_driver = driver.Firefox(~~)
- TC 전략을 잘 세워야한다.
같은 suite에서 TC간의 상호의존성을 피해야 한다. 병렬 수행을 하는 경우 하나의 테스트가 두번째 테스트에도 영향을 줄 수 있다. 이를 위해 pytest의 decorator와 markers를 사용할 수 있다.
- Assertion은 적절히
Assertion은 hard fault가 일어남을 방지하기 위해 사용할 수 있으며, 반대로 assertion으로 발생 오류의 심각도가 낮은 경우에는 계속 진행할 수 있다.
- Parallel testing 이용
pytest, pyunit, testng, cucumber 등 다른 프레임워크와 병렬적으로 사용할 수 있다. 이 때 크로스 시에 lambdatest를 많이 이용한다.
이것은 피할 것
- 파일 다운로드
링크 or 버튼 클릭을 통해서 파일 다운로드를 하는 경우 자동화는 가능하나, 해당 API가 테스트되었는지, progress를 알 수 없다.
- 2단계 보안 인증을 피하라
로그인 시도 시 OTP, 캡챠를 푸는 것은 가능은 하나 도전이 될 것이고 잘 동작한다고 보장할 수 없다. 가급적 피하되, 특정 유저는 인증을 해지하거나, IP 허용 방안을 대안으로 테스트하자.
- 성능 테스팅 하지말자
성능 테스트 시 방해되며 컨트롤 할 수 없는 외부 요소가 많다. 성능 테스팅 도구와 방법으로 selenium은 적절치 않다.
마치며
코딩을 가독성있게 효율적으로 하는 것도 중요하지만, 이전에 분석, 설계가 잘된다면 코딩할 때 막힘없이 할 수 있다고 생각한다. 그래서 코딩하기에 앞서 방법론, 구체적인 구현 방법을 많이 찾아보는데 아직은 술술 나오진 않기에 더욱 증진해야겠다!
'Automation > Selenium' 카테고리의 다른 글
| Selenium - 요소 선택 바뀐 점 (0) | 2022.03.15 |
|---|
Comment