AI를 믿지 말고 테스트를 신뢰하라

王林
풀어 주다: 2024-07-16 09:18:21
원래의
950명이 탐색했습니다.

첫 번째 이야기에서는 GitHub Copilot의 형태로 AI에 대한 경험을 이야기했습니다. 또 나를 배신했다. 하지만 나의 진정한 연인, 유닛테스트(UnitTest)

에게 살짝 잡혀버렸습니다.

현재 grpc 스트림을 사용하여 파일을 수신하는 코드를 작업 중입니다. 파일은 바이트 청크로 전송됩니다. Go에는 처음 512바이트에서 파일의 미디어 유형을 결정할 수 있는 멋진 기능이 있습니다. 나는 전송된 모든 바이트를 메모리에 보관하고 싶지 않으므로 내 목표는 미디어 유형을 스니핑하기 위해 마지막에 정확히 512바이트의 바이트 배열을 갖는 것입니다. 다른 모든 바이트는 물리적 파일 저장소에 기록된 후 폐기되어야 합니다.

저는 Golang이나 다른 언어에서 배열과 슬라이스 작업에 경험이 없습니다. 테스트 사례에서는 512바이트보다 작은 청크, 정확히 512바이트, 512바이트보다 큰 청크를 테스트하도록 선택했습니다. 왜 그런지 궁금하다면 경계 테스트가 무엇인지 확인해보세요. 저는 필기시험 경험이 많습니다.

놀랍지도 않게 4바이트만 사용한 테스트는 실패했습니다. Go 표준 라이브러리에 대해 더 자세히 알아보는 데 시간이 좀 걸렸습니다. 작은 코드 조각을 작성, 실행 및 디버깅하기가 너무 쉽기 때문에 테스트를 (잘못) 사용합니다. 제 학습 예시는 다음과 같습니다.

func TestArray(t *testing.T) {
 //target2 := [6]int{}
 target := make([]int, 6)
 first := []int{1, 2, 3}
 second := []int{4, 5}
 size := 0
 copy(target[size:], first)
 size += len(first)
 copy(target[size:], second)
 size += len(second)
 target = target[:size]
}
로그인 후 복사

AI는 설명을 도와주고 Go에서 슬라이스를 사용하는 방법을 더 잘 이해할 수 있도록 도와줍니다. 새로운 생각으로 가득 찬 젊은이들로부터 무언가를 배우는 것은 언제나 노인에게는 즐거움입니다.

Helpful explanation

GitHub Copilot의 도움으로 첫 번째와 두 번째 테스트를 통과했습니다. 제가 사용한 코드는 다음과 같습니다.

var totalFileSize uint64 = 0
sniff := make([]byte, 512)

copy(sniff[totalFileSize:], chunkMessage.Chunk)
로그인 후 복사

내 슬라이스가 범위를 벗어났기 때문에 512바이트 이상에 대한 테스트가 실패했습니다. 어쩌면 아직 배울 것이 많다는 것을 스스로 인정해야 할 때인 것 같습니다. GitHub Copilot은 다음과 같은 솔루션을 제시했습니다.

if totalFileSize < 512 {
    remaining := 512 - totalFileSize
    if len(chunkMessage.Chunk) > remaining {
        chunkMessage.Chunk = chunkMessage.Chunk[:remaining]
    }
    copy(sniff[totalFileSize:], chunkMessage.Chunk)
}
로그인 후 복사

늙은 현자로서의 오만함 속에서 나는 더 잘할 수 있다고 생각했습니다. 변명하자면 chunkMessage.Chunk는 모든 바이트가 최종 파일에 복사되어야 하기 때문에 수정할 수 없습니다. 적어도 내 눈에는 잘 작동하는 더 짧은 버전을 구현했습니다.

if totalFileSize < 512 {
  missingBytes := 512 - totalFileSize
  copy(sniff[totalFileSize:], chunkMessage.Chunk[:missingBytes])
}
로그인 후 복사

나는 AI에게 이 짧은 버전을 제안하고 내 코드에 대한 의견을 물었습니다. AI는 내 솔루션에 매우 만족했습니다.

Right, ...

…그런데 테스트를 다시 해보니 눈에서 비늘이 떨어졌어요. GitHub Copilot이 맞습니다. 저는 512바이트 이상을 복사하지 않습니다. 하지만 512바이트 미만의 테스트 케이스에서는 이 코드가 작동하지 않습니다. AI는 나를 기쁘게 하는 답을 선택하고 내가 무엇을 잘못했는지 지적하지 않았습니다. 나는 아래 코드로 끝났습니다. 이것이 두 세계의 최고입니다.

if totalFileSize < 512 {
  missingBytes := 512 - totalFileSize
  remaingBytesInChunk := uint64(len(chunkMessage.Chunk))
  if remaingBytesInChunk < missingBytes {
    missingBytes = remaingBytesInChunk
  }
  copy(sniff[totalFileSize:], chunkMessage.Chunk[:missingBytes])
}
로그인 후 복사

나는 소프트웨어 엔지니어가 테스트를 작성해야 한다고 굳게 믿습니다. 테스트는 때때로 작성하기 어렵고, 어리석고 지루한 작업이며 테스트를 유지하는 데 시간을 소비해야 합니다. 하지만 어머니처럼 그들은 당신의 생명을 보호하고 보살펴줍니다. 그들과 함께라면 걱정 없이 아기처럼 잠을 잘 수 있어요. 이제 AI도 같은 일을 합니다.

Mummy loves baby
Unsplash에서 찍은 Isaac Quesada의 사진

잘 자요 AI. UnitTest는 당신을 사랑하고 보호합니다.

위 내용은 AI를 믿지 말고 테스트를 신뢰하라의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!