Touca: 스냅샷 테스트의 개선된 대안
요약
Touca는 코드 변경으로 인한 의도치 않은 부작용(side-effects)을 찾는 데 도움을 주는 지속적인 회귀 테스트 도구입니다. 이 도구는 소프트웨어의 동작과 성능을 이전 버전과 원격으로 비교하고 차이를 실시간으로 시각화합니다. 일반적인 단위 테스트가 예상 값을 하드코딩하는 것과 달리, Touca는 다양한 입력에 대한 실제 출력을 기반으로 테스트를 수행하여 복잡한 워크플로우 검증에 효과적입니다.
핵심 포인트
- Touca는 코드 변경의 의도치 않은 부작용을 탐지합니다.
- 이전 버전과의 동작 및 성능 차이를 실시간으로 비교/시각화합니다.
- 예상 값을 하드코딩하는 단위 테스트의 한계를 극복합니다.
- Python, C++, Java, JavaScript 등 다양한 언어 SDK를 제공합니다.
엔지니어링 팀을 위한 지속적인 회귀 테스트 (Continuous Regression Testing)
Touca는 엔지니어링 팀이 일상적인 코드 변경으로 인해 발생할 수 있는 의도치 않은 부작용(unintended side-effects)을 찾는 데 도움을 줍니다. 이는 소프트웨어의 동작과 성능을 이전의 신뢰할 수 있는 버전과 원격으로 비교하고 차이를 거의 실시간으로 시각화합니다.

시작하기 (Get Started)
Docker Compose와 CLI를 통해 Touca Server를 직접 호스팅(self-host)할 수 있습니다.
brew install touca
touca server install
또는 저희가 관리하고 유지하는 Touca Cloud를 사용할 수도 있습니다.
미리보기 (Sneak Peek)
Touca는 Python, C++, Java, JavaScript용 SDK를 제공합니다.
학생의 사용자 이름(username)을 받아 그에 대한 기본적인 정보를 제공하는 소프트웨어 워크플로우를 테스트하고 싶다고 가정해 봅시다.
def test_find_student():
alice = find_student("alice")
assert alice.fullname == "Alice Anderson"
...
우리는 각 입력에 대해 예상되는 값을 하드코딩하는 단위 테스트(unit testing)를 사용할 수 있습니다. 하지만 실제 세계의 소프트웨어는 복잡합니다:
- 소프트웨어가 예상대로 작동한다는 확신을 얻기 위해서는 많은 수의 테스트 입력이 필요합니다.
- 모든 테스트 입력에 대한 소프트웨어의 예상 동작을 설명하는 것은 어렵습니다.
- 소프트웨어의 동작에 의도적인 변경을 가할 때, 예상 값을 업데이트하는 과정은 번거롭습니다.
Touca는 다양한 종류의 입력을 처리해야 하거나 예상되는 동작을 코드로 고정하기 어려운 소프트웨어 워크플로우를 테스트하는 데 효과적입니다.
import touca
from students import find_student
...
이것은 일반적인 단위 테스트(unit test)와는 약간 다릅니다:
- Touca 테스트는 예상되는 값(expected values)을 사용하지 않습니다.
- Touca 테스트는 입력 값을 코드로 고정(hard-code)하지 않습니다.
Touca를 사용하면 주어진 모든 테스트 케이스에 대해 테스트 대상 코드(under test)가 어떻게 실행되는지 설명할 수 있습니다. 우리는 흥미로운 변수의 값과 중요한 함수의 런타임(runtime)을 포착하여 해당 테스트 케이스에 대한 워크플로우의 동작 및 성능을 설명할 수 있습니다.

이제 테스트 대상 워크플로우를 변경하면, 이 테스트를 다시 실행하고 Touca가 우리가 포착한 데이터 포인트들을 이전 기준선 버전(baseline version)의 것과 자동으로 비교하여 동작이나 성능의 차이를 보고하게 할 수 있습니다.
문서화 (Documentation)
Touca가 처음이시라면, 시작하기 가장 좋은 곳은 문서화 웹사이트입니다.
커뮤니티 (Community)
Discord에서 만나요! 오셔서 인사하세요! 저희는 새로운 친구를 사귀하는 것을 좋아합니다. 도움이 필요하거나, 질문이 있거나, 기여하거나 피드백을 제공하고 싶다면, 그곳이 가장 좋은 곳입니다.
기여자 (Contributors)
<a href="https://github.com/ghorbanzade"><img src="https://avatars.githubusercontent.com/u/11810467?v=4" title="ghorbanzade" width="50" height="50"></a>
<a href="https://github.com/rmarrcode"><img src="https://avatars.githubusercontent.com/u/13802466?v=4" title="rmarrcode" width="50" height="50"></a>
<a href="https://github.com/cthulhu-irl"><img src="https://avatars.githubusercontent.com/u/23152417?v=4" title="cthulhu-irl" width="50" height="50"></a>
<a href="https://github.com/mdkhaki"><img src="https://avatars.githubusercontent.com/u/62190332?v=4" title="mdkhaki" width="50" height="50"></a>
<a href="https://github.com/afshinm"><img src="https://avatars.githubusercontent.com/u/314326?v=4" title="afshinm" width="50" height="50"></a>
<a href="https://github.com/mapron"><img src="https://avatars.githubusercontent.com/u/7624327?v=4" title="mapron" width="50" height="50"></a>
<a href="https://github.com/duncanspumpkin"><img src="https://avatars.githubusercontent.com/u/1277401?v=4" title="duncanspumpkin" width="50" height="50"></a>
<a href="https://github.com/committomaster"><img src="https://avatars.githubusercontent.com/u/20593344?v=4" title="committomaster" width="50" height="50"></a>
<a href="https://github.com/mmdbalkhi"><img src="https://avatars.githubusercontent.com/u/65954744?v=4" title="mmdbalkhi" width="50" height="50"></a>
<a href="https://github.com/depthdeluxe"><img src="https://avatars.githubusercontent.com/u/4984331?v=4" title="depthdeluxe" width="50" height="50"></a>
<a href="https://github.com/ehsan-touca"><img src="https://avatars.githubusercontent.com/u/112129743?v=4" title="ehsan-touca" width="50" height="50"></a>
<a href="https://github.com/rossh87"><img src="https://avatars.githubusercontent.com/u/36278238?v=4" title="rossh87" width="50" height="50"></a>
스폰서
⚠️ [IMG:N] 형식 토큰은 이미지 placeholder 입니다. 번역하지 말고 원래 위치에 그대로 유지하세요.
<a href="https://github.com/pykello"><img src="https://avatars.githubusercontent.com/u/628106?v=4" title="pykello" width="50" height="50"></a>
<a href="https://github.com/fffaraz"><img src="https://avatars.githubusercontent.com/u/895678?v=4" title="fffaraz" width="50" height="50"></a>
라이선스 (License)
이 저장소는 Apache-2.0 License 하에 공개되었습니다. 자세한 내용은 LICENSE를 참고하십시오.
AI 자동 생성 콘텐츠
본 콘텐츠는 HN Show HN (AI)의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기