아시다시피, 방금 작업을 시작한 코드베이스를 살펴보고 그것이 광대한 미지의 황야라는 것을 깨닫게 될 때 스며드는 불안감이 있습니다. 예상치 못한 상황을 방지하기 위한 테스트는 단 하나도 작성되지 않았습니다.
단 하나의 실수로 전체 프로젝트가 혼란에 빠질 수 있다는 것을 아는 것은 틈 위의 줄타기 위를 걷는 것과 같습니다.
테스트가 0개인 코드베이스에서 작업했다면 현재 존재하지 않는 테스트로 전체 코드베이스를 처음부터 테스트하는 것을 생각하는 것이 어려운 작업이 될 수 있다는 것을 알고 있을 것입니다.
이 프로세스에는 거의 엄청난 노력이 필요합니다. 모든 기능, 메서드 및 구성 요소를 쏟아 붓고, 모든 잠재적인 엣지 케이스를 브레인스토밍하고, 테스트 스위트 코드를 구조화하고, 모든 것이 원활하게 실행되도록 해야 합니다.
그리고 그것은 의미 있는 보도에 도달하는 데 걸리는 시간조차 다루지 않습니다. 여러분이 가만히 앉아 "예, 80% 또는 90%의 적용 범위를 달성했습니다."라고 말할 수 있기까지는 몇 주, 어쩌면 몇 달이 걸릴 것입니다.
이것이 제가 지난 몇 달 동안 작업한 내용을 공유하게 된 것을 기쁘게 생각하는 이유입니다. 이 여정은 우리를 자동화된 테스트 영역과 AI의 마법의 세계가 만나는 곳으로 안내합니다. 새로운 절친한 친구가 될 오픈 소스 개발 도구인 Pythagora를 만나보세요.
이 블로그 게시물 전반에 걸쳐 AI의 힘을 활용하여 단일 CLI 명령으로 전체 코드베이스에 대한 테스트를 생성하는 Pythagora를 사용하여 자동 테스트를 시작하고 코드베이스를 80% – 90으로 높이는 방법을 보여 드리겠습니다. 하루에 % 코드 적용 범위 .
우리 모두는 “로마는 하루아침에 이루어지지 않았다”는 말을 알고 있습니다. 포괄적이고 효과적인 테스트 스위트에 대해서도 마찬가지입니다. 세심하고 힘든 과정이지만, 일단 이 험난한 길을 횡단하고 나면 성취감은 깊습니다.
처음부터 테스트 스위트를 생성하고 탐나는 80% – 90% 코드 적용 범위에 도달하는 데 필요한 단계를 함께 살펴보겠습니다.
첫 번째 단계에서는 마치 빈 캔버스 앞의 화가와 같습니다. 세상은 가능성으로 가득 차 있으며 여러분은 자유롭게 걸작을 만들 수 있습니다.
이 경우 당신의 걸작에는 작성하려는 테스트 유형을 선택하고 , 사용할 올바른 테스트 프레임워크를 찾고, 특정 환경에 적합한 모범 사례를 채택하는 것이 포함됩니다.
단위 테스트, 통합 테스트, E2E 테스트 또는 세 가지 모두의 혼합을 고려하고 계십니까?
이 초기 설정은 종종 "쉬운" 부분으로 간주되지만 결코 공원을 산책하는 것은 아닙니다. 정보에 입각한 결정을 내리려면 시간, 조사 및 커피 몇 잔이 필요합니다.
기본 구조가 제 위치에 있으면 이제 소매를 걷어붙이고 핵심을 깊이 파고들 시간입니다. 이제 전체 코드베이스를 한 번에 함수 하나씩 살펴보고 각각에 대한 테스트를 작성해야 합니다. 여기에서 해야 할 일은 테스트가 각 함수, 메서드 또는 구성 요소 내의 모든 코드 줄에 영향을 미치는지 확인하는 것입니다.
이 작업은 복잡한 미로를 탐험하는 것과 비슷합니다. 모든 길을 횡단하고 모든 모퉁이를 돌며 돌이키지 않은 돌이 없는지 확인해야 합니다.
이러한 테스트를 작성하는 것은 자세하고 시간 집약적인 단계입니다. 단지 몇 줄의 코드를 작성하는 것이 아닙니다. 이는 함수의 목적, 예상되는 출력, 애플리케이션 내에서 상호 작용하는 방식을 이해하는 것입니다.
첫 번째 테스트가 끝나면 안도의 한숨을 쉴 수 있습니다. 그래도 잠깐만요. 아직 중요한 퍼즐 조각이 남아있습니다. 이제 예측할 수 없는 극단적인 사례의 세계 로 뛰어들 시간입니다.
이 부분은 코드 적용 범위를 늘리지는 않지만 코드의 견고성과 복원력을 테스트하는 데 중요합니다.
이러한 네거티브 테스트는 코드가 다양한 입력, 특히 예상되는 동작의 가장자리에 있는 입력에 어떻게 반응하는지 평가하는 데 도움이 됩니다. 빈 입력부터 데이터 유형의 한계를 뛰어 넘는 값까지, 이러한 테스트는 현실 세계에서 사용자 행동을 모방하도록 설계되었습니다. 현실 세계에서는 사용자가 종종 불가능하다고 생각했던 방향으로 코드를 밀어넣는 요령이 있습니다.
처음부터 테스트 스위트를 생성하는 것은 매우 어려운 작업입니다. 하지만 여러분이 쏟는 모든 노력은 더욱 강력하고 안정적이며 탄력적인 애플리케이션을 만들기 위한 한 단계이므로 안심하십시오.
그리고 기억하세요, 당신은 혼자가 아닙니다. 우리 모두는 그곳에 가본 적이 있으며, 피타고라와 같은 도구를 사용하면 그 여정은 생각보다 어렵지 않습니다.
반면, 피타고라에서는 다음을 입력할 수 있습니다.
npx pythagora --unit-tests --path ./path/to/repo
Pythagora는 모든 폴더의 모든 파일을 탐색하면서 만나는 각 기능에 대한 단위 테스트를 실행합니다. 이제 편안히 앉아 휴식을 취하거나 점심을 먹고 테스트 작성이 완료될 때까지 잠시 동안 실행되도록 놔둘 수 있습니다.
좋아, 그런데 잠깐만요, 피타고라가 도대체 뭐죠??
나는 자동화된 테스트가 나를 위해 만들어질 수 있는 세상을 항상 꿈꿔왔습니다. 그러나 현실은 그렇게 간단하지 않습니다. 당신만큼 당신의 코드를 잘 아는 사람은 없기 때문에 다른 사람이 효과적인 자동화 테스트 초안을 작성하는 것이 어렵습니다. 결과는 종종 스스로 달성할 수 있는 수준에 미치지 못합니다.
그러나 ChatGPT가 등장하자 모든 것이 바뀌었습니다. 이 기술을 만지작거리면서 "자동 테스트 작성에 ChatGPT의 힘을 활용할 수 있을까?"라는 의문이 들었습니다.
호기심이 생겨서 더 깊이 파고들어 그 기능을 실험해 보았는데, 발견한 내용에 깜짝 놀랐습니다.
ChatGPT는 코드를 이해하는 놀라운 능력을 보여주어 자동화된 테스트에서 유망한 새로운 길을 엿볼 수 있게 해주었습니다.
그리하여 피타고라에 대한 아이디어가 탄생했습니다.
Pythagora는 자동화된 테스트를 자율적으로 만드는 하나의 임무를 염두에 두고 제작된 오픈 소스 개발 도구입니다. 저는 여러분과 저 같은 개발자가 테스트 작성 및 유지 관리의 수렁에 빠지지 않고 기능 개발에 집중할 수 있는 세상을 상상합니다.
이 비전을 달성하기 위해 GPT-4를 사용하고 있습니다.
현재 피타고라는 단위 테스트와 통합 테스트를 모두 작성하는 능력을 갖추고 있습니다. 그러나 이 블로그 게시물의 목적에 따라 단위 테스트를 생성하는 기능에 중점을 둘 것입니다.
피타고라를 설치하려면 npm i pythagora
만 하면 됩니다. 그게 다야! 이제 피타고라가 여러분을 기다리고 있습니다.
피타고라가 설치되면 API 키로 구성해야 합니다. OpenAI API 키 또는 Pythagora API 키일 수 있습니다.
OpenAI API 키를 사용하려면 다음 명령을 실행해야 합니다.
npx pythagora --config --openai-api-key <OPENAI_API_KEY>
자체 OpenAI API 키를 사용하기로 선택한 경우 GPT-4에 대한 액세스 권한이 있어야 한다는 점에 유의하는 것이 중요합니다.
또는 이 링크 에서 Pythagora API 키를 얻을 수 있습니다. 일단 가지고 나면 다음 명령을 사용하여 설정하십시오.
npx pythagora --config --pythagora-api-key <PYTHAGORA_API_KEY>
특정 파일에 대한 테스트를 생성하려면 다음을 사용하세요.
npx pythagora --unit-tests --path ./path/to/file.js
특정 기능을 염두에 두고 있다면 다음을 사용하세요.
npx pythagora --unit-tests --func <FUNCTION_NAME>
커튼을 걷어내고 엔진룸을 살펴보겠습니다. 피타고라가 작동하는 이유는 무엇입니까?
기본적으로 Pythagora는 코드베이스의 복잡한 미로를 탐구하는 용감한 탐험가 역할을 합니다. 먼저, 테스트 내에서 호출할 수 있도록 파일에서 내보낸 모든 함수를 매핑합니다.
분명히 함수를 내보내지 않으면 파일 외부에서 호출할 수 없습니다. 그런데 테스트를 몇 번 생성한 후에는 코드베이스에 대해 생각하게 되고 더 많은 테스트가 생성될 수 있도록 코드베이스를 어떻게 더 잘 구성할 수 있는지 생각하게 됩니다 .
내보낸 함수를 식별하면 Pythagora는 토끼굴로 한 걸음 더 나아갑니다. 즉, 각 함수를 차례로 조사하여 내부에서 호출되는 추가 함수를 찾아냅니다.
코드베이스의 고고학자가 되어 먼지 층을 부드럽게 털어내고 숨겨진 연결과 종속성을 노출시키는 모습을 상상해 보십시오.
즉, 테스트 대상 함수 내에서 호출되는 모든 함수를 찾아서 GPT가 테스트 대상 함수가 수행하는 작업을 더 잘 이해할 수 있도록 합니다.
이 정보를 바탕으로 피타고라는 AI의 힘을 활용할 준비를 합니다. 수집된 코드를 패키징하여 Pythagora API로 전달합니다. 여기에서 실제 마법이 일어납니다. 프롬프트가 꼼꼼하게 제작되어 GPT 모델에 전달됩니다.
코드, API 및 AI 모델 간의 이러한 상호 작용으로 인해 배포 및 작업 준비가 완료된 포괄적인 단위 테스트 세트가 생성됩니다.
API 서버와 사용된 프롬프트는 모두 오픈 소스입니다. 원한다면 탐구하고, 면밀히 조사하고, 심지어 기여할 수도 있습니다. 여기에서 Pythagora API 서버를 찾을 수 있으며, 단위 테스트 생성에 필요한 프롬프트와 주요 구성 요소는 이 폴더에 저장되어 있습니다.
피타고라가 요청된 모든 테스트를 작성하고 나면 이제 직접 검토를 시작할 차례입니다. 이는 프로세스에서 중요한 단계입니다. 무엇이 생성되었는지 알고 모든 것이 기대에 부합하는지 확인하는 것이 중요합니다.
Pythagora는 Jest 기반 테스트를 생성한다는 점을 기억하세요. 따라서 생성된 모든 테스트를 실행하려면 다음을 실행하면 됩니다.
npx jest ./pythagora_tests/
이제 주의할 점은 피타고라가 아직 초기 단계라는 것입니다. 모든 젊은 프로젝트가 그렇듯이, 그 과정에서 약간의 문제가 있을 수 있습니다. 따라서 초기 실행 시 테스트 실패가 발생할 수 있습니다.
낙심하지 마십시오. 이것을 여행의 일부로 생각하십시오. 귀하의 검토와 Pythagora의 지속적인 개선을 통해 이러한 실패한 테스트는 곧 과거의 일이 될 것입니다.
그리고 밝은 면을 잊지 말자. 이러한 초기 단계의 초기 문제에도 불구하고 Pythagora는 코드베이스가 상당한, 잠재적으로 최대 90%의 테스트 적용 범위를 갖는 위치로 안내할 수 있습니다.
특히 대규모 코드베이스의 경우 검토 프로세스에는 몇 시간이 걸릴 수 있습니다. 통과한 테스트뿐만 아니라 실패한 테스트도 보고 있다는 점을 기억하십시오. 저장소에 커밋하는 모든 테스트를 이해하는 것이 중요합니다. 결국 아는 것이 힘입니다.
철저한 검토와 잠재적인 조정을 마친 후에 최종 조치를 취할 준비가 되었습니다. 즉, 생성된 테스트를 저장소에 커밋하는 것입니다. 이 마지막 단계를 통해 강력한 단위 테스트 모음을 프로젝트에 성공적으로 통합했을 것입니다.
그리고 이 모든 것은 피타고라의 힘과 터미널의 몇 줄의 명령으로 달성됩니다.
자, 이제 관심이 생겼으니 피타고라의 실제 사례, 즉 실제로 작동하는 실제 사례를 살펴보겠습니다. 시연을 위해 우리는 잘 알려진 오픈 소스 프로젝트인 Lodash를 선택했습니다.
단 하나의 Pythagora 명령을 실행하는 것만으로도 무려 1604개의 테스트를 생성하는 데 충분했으며, 전체 Lodash 저장소의 인상적인 91% 코드 적용 범위를 달성했습니다 . 그러나 인상적인 것은 단지 테스트의 양만이 아닙니다.
이 중 13개의 테스트를 통해 Lodash 마스터 브랜치 내에서 실제 버그가 발견되었습니다 .
직접 확인해 보고 싶다면 Lodash 저장소를 포크하고 Pythagora에서 생성된 테스트를 추가했습니다. 여기에서 자유롭게 탐색해 보세요.
이제 교활한 버그를 포착한 테스트 중 하나를 자세히 살펴보겠습니다.
test(`size({ 'a': 1, 'b': 2, 'length': 9 })`, () => { expect(size({ 'a': 1, 'b': 2, 'length': 9 })).toBe(3); // test returns 9 });
이 테스트에서는 Lodash의 size
함수가 JSON 개체의 크기를 반환한다고 가정합니다. 그러나 GPT는 Lodash가 객체의 실제 크기 대신 해당 키의 값을 반환할 수 있는지 확인하기 위한 약간의 트릭인 length
라는 키를 추가했습니다.
Lodash는 예상된 '3' 대신 '9'를 반환하여 테스트가 실패했기 때문에 이 계략에 빠진 것으로 보입니다.
이는 GPT 기반의 Pythagora가 레이더 아래로 쉽게 빠져나갈 수 있는 까다로운 엣지 케이스를 찾아내는 데 어떻게 탁월한지를 보여주는 환상적인 예입니다.
이러한 복잡한 테스트 사례를 자동으로 생성함으로써 Pythagora는 신뢰할 수 있는 조수가 되어 예상치 못한 버그를 발견하고 수정하는 데 도움을 줄 수 있습니다.
자, 여기까지 왔습니다, 동료 개발자 여러분. 오늘 우리는 테스트가 없는 상당한 코드베이스의 미지의 영역을 횡단하고, 신뢰할 수 있는 AI 기반 도구인 피타고라로 제작된 자동화된 테스트 제품군을 가지고 돌아오는 등 꽤 긴 여정을 시작했습니다.
당신은 험난하고 테스트가 필요 없는 코드베이스에 직면하더라도 절망할 필요가 없다는 것을 배웠습니다. 실질적인 테스트 모음을 만드는 작업이 더 이상 힘든 일이 될 필요가 없습니다.
우리는 잘 알려진 오픈 소스 라이브러리인 Lodash를 검사하고 코드 베이스의 91%에 달하는 놀라운 1604개의 테스트를 생성하면서 피타고라의 마법을 목격했습니다.
우리는 피타고라가 양뿐만 아니라 테스트의 질에도 관한 것임을 보았습니다. 단지 테스트를 위해 테스트를 만드는 것이 아니라, 눈에 띄지 않게 지나갔을 수도 있는 극단적인 사례와 버그를 지능적으로 찾아내는 것입니다.
피타고라(Pythagora)는 Lodash 마스터 브랜치에서 13개의 실제 버그를 공개했습니다. 이는 소프트웨어 테스트에서 AI의 힘을 입증하는 것입니다.
이제 피타고라(Pythagora)와 같은 AI 기반 테스트 도구가 단순한 사치품이 아니라 오늘날 빠르게 발전하는 개발 환경에서 필수적인 이유를 더 명확하게 이해해야 합니다.
따라서 테스트 없이 기존 프로젝트를 처리하든, 새 프로젝트를 시작하고 처음부터 견고한 테스트 프레임워크를 구축하려고 하든, 혼자가 아니라는 점을 기억하십시오.
피타고라(Pythagora)가 주도권을 잡고 의미 있는 테스트를 쉽게 생성할 수 있도록 돕고 훌륭한 기능 개발에 더 잘 투자할 수 있는 귀중한 시간을 절약해 줍니다.
이 여정에 함께해주셔서 감사합니다. 귀하의 프로젝트에서 피타고라를 어떻게 활용하는지 빨리 보고 싶습니다. 즐거운 코딩하세요!
추신: 이 게시물이 도움이 되었다면 Pythagora Github 저장소에 별표를 표시해 주시면 제게 큰 의미가 있을 것입니다. Pythagora를 사용해 보신 경우 [email protected] 에서 어떻게 진행되었는지 알려주세요.