첫 번째 이야기에서는 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에서 슬라이스를 사용하는 방법을 더 잘 이해할 수 있도록 도와줍니다. 새로운 생각으로 가득 찬 젊은이들로부터 무언가를 배우는 것은 언제나 노인에게는 즐거움입니다.
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는 내 솔루션에 매우 만족했습니다.
…그런데 테스트를 다시 해보니 눈에서 비늘이 떨어졌어요. 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도 같은 일을 합니다.
Unsplash에서 찍은 Isaac Quesada의 사진
잘 자요 AI. UnitTest는 당신을 사랑하고 보호합니다.
위 내용은 AI를 믿지 말고 테스트를 신뢰하라의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!