Devin 의 가상 머신에서 종단 간 테스팅 기능을 구축하며 배운 점
3 개월 전, 저는 소프트웨어 엔지니어링의 미래를 구축하기 위해 Cognition 에 합류했습니다. Devin 은 최초의 AI 소프트웨어 엔지니어로 출시된 이후 큰 발전을 이루었고, 팀이 실제로 Devin 을 매일 사용하는 모습을 보며 정말 감탄했습니다.
가장 눈에 띄었던 점은 Devin 이 클라우드에서 자율적으로 작업을 검증하기 위해 자신의 컴퓨터를 사용하는 방식이었습니다. Slack 통합 검증부터 복잡한 Windsurf 기능 테스트까지, 팀은 항상 테스트 모드의 수많은 Devin 을 운영하고 있습니다. 이 글에서는 왜 클라우드 기반 에이전트 검증에 집중하고 있는지, 그리고 이를 어떻게 구축하고 있는지 공유하겠습니다.
비동기 소프트웨어 엔지니어링으로의 전환
Cognition 에서 최근 새로운 이정표에 도달했습니다. 사상 처음으로, 이벤트, 자동화, 일정, 그리고 다른 Devin 에 의해 트리거되는 비동기 방식의 Devin 이 더 많아졌습니다. 이러한 추세는 최근 출시한 Auto-Triage 로 인해 더욱 가속화될 것으로 예상합니다.
이러한 비동기 세계로 전환함에 따라, 개발자가 머지 준비가 완료된 검증된 결과를 다시 확인할 수 있는 것이 중요해졌습니다. 올해 초 Devin Review 를 출시했습니다. 이는 복잡한 코드 변경 사항에 대한 인간의 이해를 확장하는 코드 리뷰 도구입니다. 단순히 버그를 표시하는 것을 넘어, Devin 은 리뷰 코멘트를 자동 수정하여 변경 사항이 깔끔해질 때까지 각 문제를 해결합니다. 하지만 깔끔한 리뷰만으로는 충분하지 않은 경우가 많습니다. 엔지니어는 변경 사항이 종단 간 테스트되었는지, 마치 자신이 직접 테스트한 것처럼 확인하려고 합니다.
버그 채널에서 메시지를 보기도 전에 Devin 이 사용자 불만을 해결하는 PR 을 올리는 것은 정말 멋진 경험입니다. 그리고 그 PR 에 수정 사항이 실제로 작동한다는 증거가 함께 제공될 때 더욱 마법처럼 느껴집니다. 이러한 마법은 곧 필수가 될 수도 있습니다. 선제적 에이전트의 증가로 더 많은 PR 이 생성됨에 따라, 검증되지 않은 변경 사항은 빠르게 관리 불가능 상태가 될 것입니다.
처음부터
Devin 이 출시된 이후로, 항상 클라우드 가상 머신에서 작업을 시연할 수 있었습니다. 약 6 개월 전, Devin 의 Computer Use 기능을 확장했습니다. 실제로는 Devin 의 하네스에 스크린샷 촬영, 마우스 이동, 클릭, 드래그, 입력, 키 누르기, 스크롤, 대기, 확대/축소, 녹화 시작/중지 등의 도구를 추가한 것입니다. Computer Use 기능은 한동안 존재했지만, 최신 프론티어 연구소 모델들이 이러한 도구를 활용하는 데 정말 능숙해지기 시작했다고 느꼈습니다.
Computer Use 덕분에 Devin 에 재미있는 새로운 기능이 추가되었습니다. 예를 들어 데스크탑 게임을 만들고 플레이하거나, 브라우저를 사용해 Amazon 에서 제품을 주문하는 등의 작업이 가능해졌습니다. 하지만 우리가 주목한 진짜 핵심은 Devin 이 자신의 작업을 테스트할 수 있는 능력이었습니다. Devin 은 앱을 실행하고, 클릭하며, 변경 사항이 실제로 작동하는지 엔지니어가 하는 방식과 동일하게 확인합니다. 모든 작업은 클라우드에서 실행되며 병렬로 확장 가능합니다. 엔지니어들이 각각 자체 개발 서버를 가진 10~20 개의 Devin 을 병렬로 실행하며 변경 사항을 작업하는 모습을 보았을 때, 이것이 단일 노트북에서는 절대 할 수 없는 일이라는 것을 실감했습니다. 자동화된 클라우드 테스팅은 로컬에서 코드를 실행하고 검증할 필요가 없어져 엄청난 시간을 절약해 주었습니다.
솔직히 말하면, 이 지점에 도달하는 과정은 순탄하지 않았습니다. 다양한 실패 모드를 겪었고, 각각의 실패는 이 시스템을 더 안정적으로 만들기 위해 필요한 교훈을 주었습니다.
안정성 향상
초기 버전에서는 Devin 이 테스트 중에 방향을 잃는 경우가 매우 흔했습니다. 다양한 방식으로 발생했습니다: 제품의 관련 없는 부분을 과도하게 테스트하거나, 기능에 도달하기 전 설정에서 길을 잃거나, PR 이 실제로 변경하려는 핵심 동작을 그냥 놓치는 경우였습니다.
이를 해결하기 위해 Devin 이 테스트 모드에 진입하면 먼저 테스트 계획을 작성하게 했습니다. 이 계획은 테스트할 명확한 대상을 상세히 기술해야 합니다. 계획은 소스에 근거해야 하며, 가정에 기반해서는 안 됩니다. 코드에 근거하지 않으면 모델이 존재하지 않는 앱 경로를 탐색하려는 경향이 있음을 발견했습니다. 또한 테스트 계획은 Devin 이 성공적으로 테스트할 수 있는 변경 사항의 복잡성을 크게 높였습니다. 가장 야심 찬 요청 중 일부는 여러 서비스 실행, 특정 관리자 설정, 올바른 플래그 활성화 등 동작에 도달하기 전에 필요한 기능이었습니다. Devin 이 사전에 코드를 읽으면 테스트 중간에 무언가 누락된 것을 발견하는 대신 환경을 올바르게 설정할 가능성이 훨씬 높아집니다. 테스트 계획은 일종의 사전 정렬 역할을 하여 Devin 이 적극적으로 테스트할 때 이탈할 가능성을 낮춥니다.
Devin 이 계획을 진행하면서 타임라인에 자체 주석을 추가합니다. 여기에는 설정 노트, 각 명명된 테스트의 시작, 통과/실패/테스트되지 않음으로 표시된 어설션 등이 포함됩니다. Devin 이 작업을 수행하기 직전에 예상 동작에 주석을 달면 결과에 대해 덜 거짓말을 한다는 것을 발견했습니다. 이는 테스트 주도 개발과 유사하게, 사전에 기대치를 명확히 하면 예상치 못한 결과를 통과로 합리화하기가 훨씬 어려워집니다.
테스트 흐름의 일부는 거의 모든 실행에서 반복됩니다. 로그인이 대표적인 예입니다: Computer Use 를 통해 로그인 폼을 조작하려면 이메일 입력, SSO 완료, 리디렉션 클릭, 모든 페이지 로드 대기 등의 과정을 스크린샷 하나하나 거쳐야 합니다. 이는 시간과 토큰 모두에서 비용이 많이 들 수 있습니다. 이러한 작업의 안정성과 비용을 개선하기 위해 Devin 은 이 작업을 리포지토리의 테스팅 스킬에 저장된 결정론적 스크립트로 추출했습니다. 이렇게 하면 Devin 이 스크립트를 실행하여 인증된 브라우저 세션을 몇 초 만에 얻고 테스트의 핵심 부분으로 바로 이동할 수 있습니다. 이러한 스크립트의 결정론적 특성은 불안정성을 극적으로 줄이는 데 도움이 되었습니다. 또한 Devin 이 이 루프를 자체적으로 닫도록 업데이트했습니다. 설정 단계를 어렵게 알아낸 경우, Devin 은 그 지식을 리포지토리의 테스팅 스킬로 저장하고 한 번의 클릭으로 PR 을 통해 수정 사항을 제안할 수 있습니다.
또한 테스트 단계를 다른 모델로 라우팅하는 실험도 진행 중입니다. 테스팅은 코드 작성과는 다른 강점(스크린샷 읽기, UI 상태 추적, 다음 브라우저 작업 결정 등)에 의존하기 때문에, 일부 모델이 코드 편집에 일반적으로 선택하는 모델보다 이 작업에서 더 뛰어납니다.
오늘날 Devin 에서 자율 테스팅 사용하기
Devin 은 현재 두 가지 방식으로 테스트 모드에 진입합니다: 변경 사항을 테스트하라는 명시적 요청, 또는 Devin 이 PR 을 생성한 후 해당되는 경우 변경 사항을 테스트하겠다고 제안하는 경우입니다. 그런 다음 테스트 계획을 수립하고 작업을 시작합니다.
처음 Devin 의 테스팅 기능을 사용하기 시작할 때는 도움이 필요할 때가 많습니다. 좋은 예는 앱을 로컬에서 실행할 때 시크릿이 필요한 경우입니다. 이 과정을 원활하게 하기 위해 Devin 은 세션에서 누락된 자격 증명을 요청할 수 있습니다. 더 어려운 경우, Devin 의 컴퓨터를 인계받아 OTP 코드 등을 입력할 수 있습니다. 좋은 소식은 Devin 이 리포지토리 설정을 완료하면 YAML 블루프린트 형태의 선언적 구성을 저장하여 향후 모든 세션이 부팅할 스냅샷을 생성한다는 것입니다.
결과물
Devin 이 테스트를 완료하면 앱이 작동했는지 여부만 알려주지 않습니다. 원시 화면 녹화는 유용하지만, 그것만으로는 충분하지 않다고 생각했습니다. 무엇을 보고 있는지, Devin 이 각 작업을 수행한 이유, 테스트의 어느 부분이 통과 또는 실패했는지 이해해야 합니다.
빠른 리뷰를 위해 Devin 은 실행 중 주요 순간의 레이블이 지정된 스크린샷이 포함된 테스트 보고서를 반환하여 Devin 이 무엇을 테스트했고 앱이 어떻게 보였는지 빠르게 확인할 수 있습니다.
더 깊이 있는 리뷰를 원한다면 Devin 은 풍부한 플레이어 UI 가 포함된 테스트 비디오도 생성합니다. 여기에는 챕터가 있어 테스트 섹션 간 이동, 전체 실행 탐색, 통과 또는 실패한 어설션을 시간순 목록 보기로 검사할 수 있습니다. 후처리 과정에서 작업 사이의 데드 타임은 압축되고, 작업 주변의 순간은 정상 속도로 재생됩니다. 따라서 긴 실행을 실제로 시청할 수 있는 녹화물로 압축할 수 있습니다. 이러한 아티팩트는 웹 인터페이스에서 확인할 수 있으며, Slack 에서 Devin 을 시작한 경우 Slack 으로도 배포됩니다.
어려운 부분
Computer Use 에는 여전히 어려운 부분이 있습니다. 한 예는 타이밍입니다. Devin 이 토스트 알림을 테스트하는 경우, 너무 이르거나 늦게 찍은 스크린샷은 토스트를 완전히 놓칠 수 있으며, 모델은 예상 동작이 실제로 발생했는지 혼란스러워할 수 있습니다.
또 다른 실패 모드는 치팅입니다. 자율적으로 작동할 때 모델은 UI 를 클릭하는 대신 브라우저에서 JavaScript 를 실행하여 프로그래밍 방식으로 상태를 트리거하는 데 지나치게 의존할 수 있습니다. 이는 기능 테스트에 도움이 될 수 있지만, 사용자는 Devin 이 실제 사용자처럼 앱을 사용하는 모습을 보고 싶어할 것입니다.
우리는 개선된 평가, 하네스의 더 엄격한 가드레일, 그리고 Computer Use 에 더 능숙해지는 새로운 세대의 모델을 통해 이러한 문제를 적극적으로 해결하고 있습니다.
비동기 개발의 미래는 검증이다
지난 몇 달 동안 Devin 에서 승인된 일일 테스트 실행 수가 두 배 이상 증가했습니다. 이러한 성장은 단순한 사실을 반영합니다: 비동기 에이전트는 개발자가 그 결과를 신뢰할 수 있을 때만 유용하다는 것입니다. 종종 그 신뢰는 코드만으로는 얻을 수 없습니다. 많은 변경 사항에 대해 앱이 실제로 실행되었는지, 중요한 흐름이 테스트되었는지, 결과가 쉽게 검사할 수 있는 방식으로 캡처되었는지 확인하고 싶습니다.
Devin 의 자율 테스팅이 바로 그 목적을 제공합니다. Devin 은 테스트를 계획하고, 앱을 작동시키며, 발생한 일을 기록하고 주석을 달며, 마지막으로 결과를 검토 가능하게 만드는 아티팩트를 반환합니다. 아직 개선할 점은 많지만, 이것이 미래의 올바른 방향이라고 생각합니다: 작업을 비동기적으로 완료할 뿐만 아니라 증거를 가지고 돌아오는 에이전트 말입니다.
Devin 이 자신의 작업을 테스트하여 우리의 시간을 얼마나 절약해 주는지 항상 놀라움을 금치 못하며, 많은 고객이 Devin 의 자동화된 테스팅 기능을 충분히 활용하지 못하고 있다고 느낍니다. 실험을 지원하기 위해 현재 테스트 모드에서는 정상 사용 비용의 1/5 만 청구하고 있습니다.
app.devin.ai 또는 windsurf.com 에서 저희의 작업을 체험해 보세요. 그리고 이런 문제를 해결하는 일이 재미있게 느껴진다면 ido [at] cognition.ai 로 연락 주세요.





