클린 코드를 위한 테스트 주도 개발 6

2016-09-24

p.163

    사실 8, 9장은 멘토님께서 그냥 넘어가도 된다고 했지만 애초에 책에 있는 모든 오류를 찾아내겠다고 첫 포스팅을 시작했기 때문에 그냥 하기로 했다. 사실 그리 어려운 문제는 아니다. 안그래도 책 읽는 속도가 느린데(…) p.156functional_tests/tests.py를 치면 아래와 같은 에러가 생긴다.

type object 'NewVisitorTest' has no attribute 'server_thread'

    이는 p.156functional_tests/tests.py에서 tearDownClassgi 함수를 제거해주면 된다. 따라서 p.156functional_tests/tests.py는 아래와 같이 바뀐다.

class NewVisitorTest(StaticLiveServerTestCase):

    @classmethod
    def setUpClass(cls):
        for arg in sys.argv:
            if 'liveserver' in arg:
                cls.server_url = 'http://' + arg.split('=')[1]
                return
        super().setUpClass()
        cls.server_url = cls.live_server_url

    def setUp(self):
        [...]

    하지만 이대로 치면 아래와 같은 에러가 생긴다.

AttributeError: 'NewVisitorTest' object has no attribute 'server_url'

    setUpClass함수 내부 곳곳에 print를 찍어본 결과 for문 내에 진입은 하는데 if 'liveserver' in arg:안으로는 진입이 되지않았다. 그래서 arg를 모두 출력해 보았다.

Creating test database for alias 'default'...
 ,  manage.py
 ,  test
 ,  functional_tests
 ,  --liveserver=superlists-52.78.139.60
E
======================================================================
ERROR: setUpClass (functional_tests.tests.NewVisitorTest)
----------------------------------------------------------------------
[..이하생략..]

    arg내에 liveserver라는 인자가 내 서버주소를 가지고있는 것인줄 알았는데 아니었다. 따라서 바뀐 나의 코드는 아래와 같다. 여러분의 주소에 맞게 적당히 적어주면 된다. aws 12개월의 무료 티어 이용이 끝났기 때문에 서울 리전에서 t2.nano를 쓰는중이다. AWS EC2 요금. 블로그 방문자 수가 적어서 상관없을 것 같지만 괜히 내 서버에 장난은 안했으면 좋겠다. ㅜㅜ

class NewVisitorTest(StaticLiveServerTestCase):

    @classmethod
    def setUpClass(cls):
        for arg in sys.argv:
            # print(" , ", arg)
            if '--liveserver=superlists-52.78.139.60' in arg:
                cls.server_url = 'http://52.78.139.60'
                return
        super().setUpClass()
        cls.server_url = cls.live_server_url

    def setUp(self):
        [...]
(venv-3.5.2) choehyeseonui-MacBook-Pro:superlists hsun$ python manage.py test functional_tests --liveserver=superlists-52.78.139.60
Creating test database for alias 'default'...
[…]
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"id","selector":"id_new_item"}
[…]
    self.assertIn('To-Do', self.browser.title)
AssertionError: 'To-Do' not found in 'Welcome to nginx!'

----------------------------------------------------------------------
Ran 2 tests in 9.769s

FAILED (failures=1, errors=1)
Destroying test database for alias 'default'...

‘진짜’ 진전이 있다!