python 에서 BDD 하기 – phantomjs + lettuce

REF #1: https://pythonhosted.org/behave/comparison.html

REF #2: http://lettuce.it/recipes/django-lxml.html

 

코드레벨은 귀찮기 때문에 다루지 않고 왜 어떤 툴을 선택해서 사용하는지만 간단히 적어본다.

 

현재 앱 내에 자주 바뀌는 부분에 대해서는 웹뷰를 이용해 처리하고 있다.

자주 바뀌기 때문에 안정성을 위해 CI 를 도입했지만 백엔드 부분만 커버가 되고 ajax 콜에 대해서는 커버를 할 수 없었다.

예를 들면 API 서버도 정상, Django 앱도 정상이지만 javascript 부분이 로딩에러든 뭐든 에러가 나면서 기능이 정상동작 하지 않는다던가 데이터를 못가져와서 빈 페이지를 보여주던가 하는 것이다.

이러한 문제를 해결하기 위해 인수테스트를 적용하기로 했고 인수테스트 하면 BDD 라고 생각해서 Django 와 함께 쓸 BDD 툴을 몇 개 찾아봤다.

pyccuracy + selenium 은 옛날에 몇달간 써본적이 있어서 해보려고 했는데 대안으로 splinter 라는게 있었다. headless(브라우저 없이 드라이버로만 테스트) 와 no headless (브라우저가 떠서 테스트) 가 다 필요할 땐 splinter 가 좋을 것 같은데 headless 만 있으면 되어서 splinter 는 안쓰기로 했고 자연스럽게 phantomjs 를 사용하기로 했다.

 

인수테스트는 자연어인 feature 와 feature 에 대응하는 python 코드인 action 으로 구성된다.

pyccuracy는 imperative 해서 action 단위가 굉장히 간소화되어 있어서 feature 에 작성할 게 많았는데 lettuce, behave 라는 친구들은 declarative 해서 feature 가 간소화되고 action 쪽에 작성할 게 많았다.

아무래도 자연어인 feature 를 읽기 편하게 하는 것이 유지보수 측면에서 나을 것 같아서 기존에 쓰던 pyccuracy 는 버리고 lettuce 나 behave 를 쓰기로 했다.

 

lettuce 와 behave 중 선택은 실제로 feature 를 작성해보니 lettuce 쪽이 좀 더 직관적이고 pythonic 하다고 생각되어 (내 취향이라) lettuce 를 사용하기로 했다.

 

결국 selenium, phantomjs, lettuce,  lettuce_webdriver 를 이용하여 인수테스트를 작성했고, CI는headless 로 ajax 가 제대로 동작하는 지에 대해서도 커버할 수 있게 되었다.