Vertrauen Sie nicht der KI, vertrauen Sie Tests

王林
Freigeben: 2024-07-16 09:18:21
Original
1009 Leute haben es durchsucht

In meiner allerersten Geschichte habe ich über meine Erfahrungen mit KI in Form von GitHub Copilot gesprochen. Es hat mich wieder einmal verraten. Aber ich wurde sanft von meinem wahren Liebhaber erwischt: UnitTest


Ich arbeite derzeit an Code, der eine Datei über einen Grpc-Stream empfängt. Die Datei wird in Byte-Blöcken gesendet. Go verfügt über eine nette Funktion, mit der Sie den Medientyp einer Datei anhand der ersten 512 Bytes bestimmen können. Ich möchte nicht alle gesendeten Bytes im Speicher behalten, daher ist es mein Ziel, am Ende ein Byte-Array mit genau 512 Bytes zu haben, um den Medientyp zu erkennen. Alle anderen Bytes sollten in einen physischen Dateispeicher geschrieben und dann verworfen werden.

Ich habe weder in Golang noch in anderen Sprachen viel Erfahrung mit der Arbeit mit Arrays und Slices. Für meine Testfälle teste ich Blöcke, die kleiner als 512 Byte, genau 512 Byte und größer als 512 Byte sind. Wenn Sie sich fragen, warum, schauen Sie sich an, was Grenztests sind. Ich habe viel Erfahrung im Schreiben von Tests.

Es überrascht nicht, dass der Test mit nur 4 Bytes fehlschlug. Es hat einige Zeit gedauert, bis ich tiefer in die Go-Standardbibliotheken eingetaucht bin. Ich verwende dafür (fälschlicherweise) Tests, weil es so einfach ist, kleine Codeausschnitte zu schreiben, auszuführen und zu debuggen. Hier ist mein Lernbeispiel:

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]
}
Nach dem Login kopieren

KI hilft mir mit Erklärungen und gibt mir ein besseres Verständnis für die Verwendung von Slices in Go. Für einen alten Mann ist es immer eine Freude, etwas von der Jugend voller neuer Ideen zu lernen.

Helpful explanation

Mit Hilfe von GitHub Copilot bestehen mein erster und zweiter Test. Hier ist der Code, den ich verwendet habe:

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

copy(sniff[totalFileSize:], chunkMessage.Chunk)
Nach dem Login kopieren

Der Test für mehr als 512 Byte ist fehlgeschlagen, weil mein Slice außerhalb des Bereichs lag. Vielleicht ist es an der Zeit, dass ich mir eingestehe, dass ich noch viel zu lernen habe. GitHub Copilot hat die folgende Lösung gefunden:

if totalFileSize < 512 {
    remaining := 512 - totalFileSize
    if len(chunkMessage.Chunk) > remaining {
        chunkMessage.Chunk = chunkMessage.Chunk[:remaining]
    }
    copy(sniff[totalFileSize:], chunkMessage.Chunk)
}
Nach dem Login kopieren

In meiner Arroganz als alter, weiser Mann dachte ich, ich könnte es besser machen. Zu meiner Verteidigung kann chunkMessage.Chunk nicht geändert werden, da alle Bytes in die endgültige Datei kopiert werden müssen. Ich habe eine kürzere Version implementiert, die zumindest in meinen Augen gut funktioniert hat.

if totalFileSize < 512 {
  missingBytes := 512 - totalFileSize
  copy(sniff[totalFileSize:], chunkMessage.Chunk[:missingBytes])
}
Nach dem Login kopieren

Ich habe der KI diese kürzere Version vorgeschlagen und sie um ihre Meinung zu meinem Code gebeten. Die KI war mit meiner Lösung sehr zufrieden.

Right, ...

…aber als ich die Tests noch einmal durchführte, fiel es mir wie Schuppen von den Augen. GitHub Copilot hat recht, ich kopiere nicht mehr als 512 Bytes. Aber im Testfall, in dem ich weniger als 512 Bytes habe, funktioniert dieser Code nicht. Die KI wählte eine Antwort, die mir gefiel, und vermied es, mich darauf hinzuweisen, was ich falsch gemacht hatte. Am Ende habe ich den folgenden Code erhalten. Das ist das Beste aus beiden Welten.

if totalFileSize < 512 {
  missingBytes := 512 - totalFileSize
  remaingBytesInChunk := uint64(len(chunkMessage.Chunk))
  if remaingBytesInChunk < missingBytes {
    missingBytes = remaingBytesInChunk
  }
  copy(sniff[totalFileSize:], chunkMessage.Chunk[:missingBytes])
}
Nach dem Login kopieren

Ich bin der festen Überzeugung, dass ein Softwareentwickler Tests schreiben muss. Tests sind manchmal schwierig zu schreiben, es ist dumme, langweilige Arbeit und man muss Zeit aufwenden, um sie zu pflegen. Aber wie eine Mutter sichern sie Ihr Leben und kümmern sich um Sie. Mit ihnen kann ich ohne Sorgen wie ein Baby schlafen. Jetzt macht die KI dasselbe.

Mummy loves baby
Foto von Isaac Quesada auf Unsplash

Schlaf gut, AI. UnitTest liebt und beschützt Sie.

Das obige ist der detaillierte Inhalt vonVertrauen Sie nicht der KI, vertrauen Sie Tests. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:dev.to
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage