Bombadil의 새 사용자 인터페이스용 속성 기반 테스트 프레임워크를 바탕으로 터미널 사용자 인터페이스를 퍼징한 초기 실험과 실제 소프트웨어에서 발견한 버그들을 소개합니다.
지난주 Bug Bash 2026에서, 우리의 새로운 사용자 인터페이스용 속성 기반 테스트 프레임워크인 Bombadil로 웹이 아닌 인터페이스를 테스트하는 것에 관해 흥미로운 대화를 많이 나눴습니다. 제가 이미 탐구해 보고 싶었던 방향 중 하나는 터미널 사용자 인터페이스 (TUI)였고, 복도에서의 대화들이 시작해 보라고 등을 떠밀어 주었습니다. 집으로 돌아오는 비행기 안에서 코드를 이것저것 만지기 시작했고, 며칠 뒤에는 그 TUI 퍼저의 배아가 모습을 드러내기 시작했습니다.
vitetris에서 버그를 찾아내는 퍼저의 동작 모습. (주의: 번쩍임!) 이것은 두 가지 핵심 크레이트 위에 구축되어 있습니다:
이 두 가지가 준비되자, 저는 TUI를 위한 아주 기본적인 퍼저를 만들었습니다. 이 퍼저는 주어진 명령을 실행하고, 그 출력을 폴링하며, 무작위 입력 시퀀스(출력 가능한 ASCII 문자와 ANSI 이스케이프 시퀀스)를 번갈아 기록합니다. 또한 가끔 터미널을 스크롤하고 크기를 조절합니다. 타이밍은 조금 까다롭지만, 현재 접근법은 잘 작동하는 듯합니다. 폴링은 터미널이 유휴 상태가 될 때까지 읽고, 상태를 캡처한 다음, 새로운 입력을 적용합니다. 속도 면에서는 테스트되는 프로그램에 많이 좌우되지만, 초당 최소 300개의 상태를 캡처할 수는 있어 보입니다.
테스트할 몇 가지 기본적인 TUI 프로그램과 터미널 게임을 찾아봤습니다. 놀랍게도, 처음 며칠 사이에 실제 소프트웨어에서 그럴듯해 보이는 실제 버그 네 개를 찾아냈습니다:
6) 원격 게임에 연결하려고 하면 UI가 멈추는 버그가 있습니다.꽤 멋집니다. 오늘 저는 이 작업을 Bombadil의 main에 병합했습니다. 아직 릴리스되지는 않았지만, 궁금하다면 CI 아티팩트에서 bombadil-terminal 바이너리를 내려받아 이미 사용해 볼 수 있습니다. macOS에서는 GateKeeper를 우회하려면 quarantine 비트를 제거해야 합니다.
이제 이것을 탄탄한 도구로 만드는 일이 남았습니다. 앞으로의 목표는 다음과 같습니다:
querySelector와 비슷한 API를 제공해 박스 드로잉 문자로 그려진 패널을 파싱하고 순회할 수 있다면 멋질 것입니다. 아마 그런 테두리들이 올바르게 정렬되는지도 검증하고 싶을 것입니다.bombadil 바이너리의 일부로 만들기. browser와 terminal 테스트 도구를 위한 서브커맨드가 있을 수 있습니다.좋습니다, 오늘은 짧은 글입니다 — 그저 제 흥분감과 초기 결과를 공유하고 싶었습니다.
libghostty-rs의 유지관리자인 Uzair Aftab에게, Nix 환경에서 libghostty-vt를 빌드할 수 있도록 도와주신 데 대해 진심으로 감사드립니다!