벽호 테스트에 대한 경험 노트

안녕하세요!
LAPRAS에서 롤러코스터를 개발하고 있습니다!
정신을 차리니 벌써 12월이야.advent 달력의 계절이 되었어. 그래서 처음으로 Zenn에 투고해 봤어.
LAPRAS 유쾌한 동료들의 기사를 꼭 봐주세요!
https://qiita.com/advent-calendar/2020/lapras

자유형에 대한 테스트


복제 엔지니어로서 지금까지 여러 가지 복제 기술을 개발해 왔지만 복제 기술 개발에 대한 문의도 많았다.'복제 인간은 어떻게 테스트해야 하나요?'이렇게 물어보니까
이 글에서 나는 지금까지의 자유형 개발 경험에서 어떤 테스트를 구축했는지 간단하게 썼다.

자유형에서 의식해야 할 테스트 종류


Unit test


어떤 구성 요소로 설계되는지 여기서 상세한 내용을 쓰지 않는 것은 구성 요소 단위의 단원 테스트가 자유형이어서 쓰기 어렵다는 것이 아니라 일반적인 소프트웨어와 마찬가지로 테스트를 쓸 수 있다.
예를 들어 HTML을 해석한 후 구조화된 데이터로 변환할 책임이 있는 구성 요소를 만든다.(나는 기본적으로 이런 조립품을 만들 줄 안다)
이 구성 요소는 다음과 같은 처리입니다 PageParser.
@dataclass
class PageData:
    title: str
    description: str

@dataclass
class PageParser:
    html: str
    
    def parse(self) -> PageData:
        return PageData(
	    # パースの処理は Beautiful Soup とか lxml で実装することになる
            title="Somehow parse title from self.html",
            description="Somehow parse description from self.html",
        )
에 대한 테스트는 다음과 같다.
테스트 데이터를 미리 준비해서 이 구성 요소에 고정적으로 입력하는 것이 중점이다.
class PageParserTest(TestCase):
    def test_parse(self):
        with open(f"{os.path.dirname(__file__)}/data/test.html") as f:
            test_html = f.read()
        parser = PageParser(html=test_html)
        parsed_data = parser.parse()

        self.assertEqual(parsed_data.title, "title of html")
        self.assertEqual(parsed_data.descriptionn, "description of html")
이 테스트를 통과하기만 하면 구상된 HTML의 해석 처리가 손상되지 않도록 보증합니다.
이때 "모자간 HTML이 변경된 경우 어떻게 하나요?"이런 의문이 떠올랐지만, 단원 시험은 그 일을 고려하지 않았다.

유닛 테스트 실패


단원 테스트가 필요할 때, 즉 단원 테스트가 실패할 가능성이 있을 때는 언제입니까?
이것은 우리가 목표 구성 요소의 코드를 변경할 때 테스트가 항상 실패하기 때문일 수 있습니다.
특히 팩스 조작을 할 때 테스트를 발판으로 기존 코드를 파괴하지 않았는지 확인해야 하기 때문에 단원 테스트의 동작 보증이 매우 중요하다.

Unit test 실행 시간


코드가 변경될 때마다 테스트를 하는 것이 이상적이기 때문에push의 저장 시간과 구축 실행을 트리거로 테스트하는 것이 좋습니다.
이외에도 이번에 소개한 것처럼 테스트 코드를 작성해 자유형이라도 TDD에서 개발할 수 있기 때문에 TDD 개발 상황에서 로컬 환경에서 빈번하게 테스트를 진행한다.

Contract test


그럼 아까'의상실 HTML이 변경된 경우 어떻게 할까요?'이런 의문을 해결하기 위해 어떻게 하면 좋을까요?
이런'협동조합 시스템이 예상한 인터페이스에 따라 돌아가고 있습니까?'테스트는 일반 소프트웨어 테스트 유형에 정의된 "Contract test"유형의 테스트로 이해할 수 있습니다.
구체적인 테스트 코드를 살펴봅시다.
class PageContractTest(TestCase):
    def test_parse(self):
        response = requests.get("http://<url of contract test target>")
        self.assertEqual(response.status_code, 200)

        parser = PageParser(html=response.text)
        parsed_data = parser.parse()

        self.assertEqual(parsed_data.title, "title of html")
        self.assertEqual(parsed_data.descriptionn, "description of html")
언뜻 보니까 아까 테스트랑 다를 게 없죠?
단원 테스트와 다른 점은 대항자의 서비스를 실제로 연결했다는 점이다.
이 테스트는 사실상 자유형 목적지의 서비스에 HTTP 요청을 보내고 그 응답에 대한 쓰기 테스트를 하는 것이다.

Contract test 실패 시기


Contract test가 실패할 가능성이 있는 경우는 언제입니까?
이것은 원래 테스트하고자 했던 대상과 마찬가지로'자유영 목적지의 HTML 구조가 변할 때'이 테스트는 실패했다.그리고 테스트 실패의 촉발 변경은 자유형 자체의 코드 변경이 아니라 자유형 목적지의 서비스 변경이다.
Contract test 실패는 다음과 같습니다.
  • 복제 서비스의 HTML 구조가 변경되었을 때
  • 서버 오류 등 일시적인 문제 발생 시
  • 자유형 목적지의 HTML 구조가 바뀌면 자유형 처리를 수정해야 한다.
    이때 방금 소개한 Unit test가 있으면 테스트 데이터의 HTML도 동시에 최신 내용으로 업데이트됩니다.

    Contract test 실행 시간


    물론 자유형 목적지 서비스가 어떤 주파수로 이뤄졌는지, 앞으로 어떤 변경이 있을지 전혀 알 수 없다.
    따라서 Contract test의 실행은 코드의push와 프로그램의 시간에 의존하지 않고, 이곳의 임의의 시간에 정기적으로 실행됩니다.
    실제 서비스에 접근하기 위해 고주파로 테스트를 하지 않고 하루에 한 번에서 몇 번씩 수행하는 경우가 많다.
    (이걸 써서 눈치챘는데 정해진 시간보다 랜덤으로 실행하는 것도 괜찮을 것 같다)
    CircleaCI와 GiitHub actions에서는 크론처럼 작업의 일정 집행을 설정할 수 있기 때문에 이런 기능을 활용하거나 정기적인 작업을 수행할 수 있는 작업 스케줄러를 사용할 수 있다.

    총결산


    이번에는 자유형 개발에서 의식해야 할 테스트를 간단하게 소개했다.
    "Contract test"라는 단어가 이 슬라이드에서 사용되고 있다는 것을 나 자신이 처음 알았다.이 슬라이드는 마이크로 서비스 테스트에 관한 것이기 때문에 상하문이 좀 다르다. 덕분에 나는 이런 테스트를 언어화시켰다.
    https://martinfowler.com/articles/microservice-testing/#testing-progress-3
    파이톤의 자유형 프레임워크Scrapy에는 PageParser라는 자유형 테스트용 명령이 준비되어 있는데, 이때 실행되는 테스트 용례는 $ scrapy check라는 모듈에 기초류를 설정했다.
    처음 이걸 봤을 때 왜contract였는지 모르겠지만 Contract test라는 단어를 알았을 때 "그것contract은 Contract test에서 왔나요!"그렇게 이해했어.
    자유형은 자신이 통제할 수 없는 요소에 대한 의존성이 강하기 때문에 "테스트를 쓰는 것도 의미가 없다!"아니면 "시험 어려워요!"그렇게 생각할지 모르지만 자유형을 구성하는 구성 요소와 경계를 적절하게 설계하면 일반적인 소프트웨어와 마찬가지로 테스트를 써서 튼튼한 개발을 할 수 있다.
    모자간의 품질에 대해 고민이 있으시다면 꼭 참고하세요!

    선전하다.


    그럼, 우리는 LAPRAS 서비스를 개발하여 이번에 소개한 테스트를 작성한 기어오르기를 통해 인터넷상의 출력에서 자신의 프로필을 자동으로 구축합니다!
    꼭 로그인해 보세요~!
    https://lapras.com/

    좋은 웹페이지 즐겨찾기