Maison > développement back-end > Golang > le corps du texte

Ne faites pas confiance à l'IA, faites confiance aux tests

王林
Libérer: 2024-07-16 09:18:21
original
950 Les gens l'ont consulté

Dans ma toute première histoire, j'ai parlé de mon expérience avec l'IA sous la forme de GitHub Copilot. Cela m'a encore trahi. Mais j'ai été doucement attrapé par mon véritable amant : UnitTest


Je travaille actuellement sur du code qui reçoit un fichier en utilisant un flux grpc. Le fichier est envoyé en morceaux d'octets. Go a une fonctionnalité intéressante qui vous permet de déterminer le type de média d'un fichier à partir des 512 premiers octets. Je ne souhaite pas conserver tous les octets envoyés en mémoire, mon objectif est donc d'avoir un tableau d'octets d'exactement 512 octets à la fin pour détecter le type de média. Tous les autres octets doivent être écrits dans un stockage de fichiers physique, puis supprimés.

Je n'ai pas beaucoup d'expérience dans le travail avec des tableaux et des tranches en Golang, ni dans d'autres langages. Pour mes cas de test, j'ai choisi de tester des morceaux inférieurs à 512 octets, exactement 512 octets et supérieurs à 512 octets. Si vous vous demandez pourquoi, découvrez ce que sont les tests de limites. J'ai beaucoup d'expérience dans la rédaction de tests.

Sans surprise, le test avec seulement 4 octets a échoué. Il m'a fallu un certain temps pour approfondir les bibliothèques standard. J'utilise (à mauvais escient) des tests pour cela car il est si facile d'écrire, d'exécuter et de déboguer de petits extraits de code. Voici mon exemple d'apprentissage :

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]
}
Copier après la connexion

L'IA m'aide avec les explications et me permet de mieux comprendre comment utiliser les tranches dans Go. C'est toujours un plaisir pour un vieil homme d'apprendre quelque chose de la jeunesse pleine d'idées nouvelles.

Helpful explanation

Avec l'aide de GitHub Copilot, mes premier et deuxième tests réussissent. Voici le code que j'ai utilisé :

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

copy(sniff[totalFileSize:], chunkMessage.Chunk)
Copier après la connexion

Le test sur plus de 512 octets a échoué car ma tranche était hors de portée. Il est peut-être temps pour moi d’admettre que j’ai encore beaucoup à apprendre. GitHub Copilot a proposé la solution suivante :

if totalFileSize < 512 {
    remaining := 512 - totalFileSize
    if len(chunkMessage.Chunk) > remaining {
        chunkMessage.Chunk = chunkMessage.Chunk[:remaining]
    }
    copy(sniff[totalFileSize:], chunkMessage.Chunk)
}
Copier après la connexion

Dans mon arrogance de vieux sage, je pensais pouvoir faire mieux. Pour ma défense, chunkMessage.Chunk ne peut pas être modifié car tous les octets doivent être copiés dans le fichier final. J'ai implémenté une version plus courte qui a bien fonctionné, du moins à mes yeux.

if totalFileSize < 512 {
  missingBytes := 512 - totalFileSize
  copy(sniff[totalFileSize:], chunkMessage.Chunk[:missingBytes])
}
Copier après la connexion

J'ai proposé cette version plus courte à l'IA et lui ai demandé son avis sur mon code. L'IA a été très satisfaite de ma solution.

Right, ...

… mais quand j'ai refait les tests, les écailles sont tombées de mes yeux. GitHub Copilot a raison, je ne copie pas plus de 512 octets. Mais dans le cas de test où j'ai moins de 512 octets, ce code ne fonctionne pas. L’IA a choisi une réponse pour me plaire et a évité de souligner ce que j’avais mal fait. Je me suis retrouvé avec le code ci-dessous. C'est le meilleur des deux mondes.

if totalFileSize < 512 {
  missingBytes := 512 - totalFileSize
  remaingBytesInChunk := uint64(len(chunkMessage.Chunk))
  if remaingBytesInChunk < missingBytes {
    missingBytes = remaingBytesInChunk
  }
  copy(sniff[totalFileSize:], chunkMessage.Chunk[:missingBytes])
}
Copier après la connexion

Je crois fermement qu'un ingénieur logiciel doit écrire des tests. Les tests sont parfois difficiles à écrire, c'est un travail stupide et ennuyeux et il faut passer du temps à les maintenir. Mais telle une mère, elles sécurisent votre vie et prennent soin de vous. Avec eux, je peux dormir comme un bébé sans soucis. Maintenant, l'IA fait de même.

Mummy loves baby
Photo d'Isaac Quesada sur Unsplash

Dors bien, AI. UnitTest vous aime et vous protège.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:dev.to
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!