2022.02.13

6818 단어 TILTIL

xUnit 에서 도대체 무엇을 만드나요?

이번 TIL 은 2022.02.12 에서 이어집니다.

이전의 테스트 주도 개발 18 장 실습에서 테스트 케이스 에 대한 이해에 어려움을 겪었습니다. 코드로 간단히 보자면 다음과 같은 모양입니다.

class TestCase:
    def __init__(self, name):
        self.name = name

    def run(self):
        method = getattr(self, self.name)
        method()


class WasRun(TestCase): # TestCase 를 상속받음
    def __init__(self, name):
        self.wasRun = False
        TestCase.__init__(self, name)

    def testMethod(self):
        self.wasRun = True


class TestCaseTest(TestCase): # TestCase 를 상속받음
    def testRunning(self):
        test = WasRun("testMethod")
        assert not test.wasRun
        test.run()
        assert test.wasRun

WasRunTestCaseTest 라는 테스트 케이스가 TestCase 를 상속받는 구조를 취하고 있는 것을 볼 수 있습니다. 이런 모양이 왜 필요한 걸까요?

이 모양을 이해하기 위해서는 두가지의 점검이 필요합니다. 첫번째는 우리가 무엇을 만들려고 했는지 입니다. 목표를 다시 상기해보자면, 자신만의 테스팅 프레임워크 만들기 입니다. 생각해보면, 세상에는 많은 테스팅 프레임워크들이 있고, 구성도 다양합니다. Jest, Mocha, Chai, Jasmine, JUnit 등 아는 것들만 나열해도 많네요. 그럼 우리는 이렇게 다양한 모양중에 어떤 설계를 바탕으로 만드는 것일까요?

여기서 두번째 할일은 책의 배경에 대한 뒷조사 입니다. 다행히 아샬님께서 조언해주신 덕택에 책에서 구체적으로 무엇을 만들려 하는 것인지에 대해서 알 수 있게 되었습니다. XUnit 패턴과 유사한 구조를 만드는 것이 목표이고, 이 패턴의 사용경험이나 지식이 부족한 것이 이해가 안되는 원인이었네요.

이제 무엇을 모르는가 에 대한 부분이 구체적인 형태로 나타났습니다. 할일이 생긴것이죠. JUnit3 에서의 쓰임새와 일반적인 XUnit 패턴에 대해서 더 알아보아야겠습니다.

글을 읽고

내용 파악에 시간이 걸렸는데요. 다음 문단을 읽고 나서야 어떻게 쓰는지, 왜 이렇게 쓰는지에 대한 답을 얻을 수 있었습니다.

In object-oriented languages, we prefer to put our Test Methods onto a class rather than having them as global functions or procedures (even if that is allowed.) By making them instance methods of a Testcase Class we can create a Testcase Object for each test by instantiating the Testcase Class once for each Test Method. This allows us to manipulate the Test Methods at runtime.

TestCase 클래스는 여러개의 TestMethods 를 가지고 있습니다. TestCase 의 인스턴스를 만들때, 생성자에 TestMethod 의 이름을 넣어주는 방식으로 사용합니다. 즉, 클라이언트에서는 어떤 TestMethod 를 이용할지를 객체 생성시점에 결정해줄 수 있는것입니다. 그 결과로 객체와 TestMethod 가 대응하게 되죠.

class TestCalculator(TestCase):
	def testAdd():
    	# ...
    def testSubtract():
    	# ...
 
 # client
 TestCalculator("testAdd").run()
 TestCalculator("testSubtract").run()

좋은 웹페이지 즐겨찾기