[PYTHON] Culture de code de test en interne à partir d'une seule personne

Une histoire sur un ingénieur salarié qui travaille pour une entreprise qui n'a pas de culture de code de test et qui travaille dur pour diffuser la culture de test tout en demandant le teint du manager. À la fin de l'article, j'écris le point de vue lors de la révision du code du test.

La proposition d'écrire du code de test dans un nouveau développement a été rejetée

«C'est un projet de lancement. L'idée d'écrire le code de test en équipe en un mot du manager a été rejetée. Je pourrais comprendre pourquoi je ne devrais pas partir à l'aventure parce que je n'ai pas le savoir-faire pour écrire du code de test en interne. Cependant, il devrait être acceptable d'écrire un test pendant mon temps libre, alors j'ai décidé de faire de mon mieux.

Tester la culture du code à partir d'une seule personne

Quand j'ai demandé à un ingénieur que j'étais au courant, il y avait environ deux personnes qui avaient passé un test. Je ne lui dirai pas, mais il sera certifié en tant que mentor et vous enseignera des méthodes efficaces et un savoir-faire avec Python et Django. Avec le recul, je pense que j'ai été béni avec l'environnement. Adopté Pytest, qui a plusieurs cadres de test pour Python mais a une solide documentation officielle. Pytest est très fonctionnel et la documentation est compliquée, donc je pense que vous pouvez apprendre à l'utiliser avec des exemples et à l'utiliser comme dictionnaire.

Installer pytest


pip install pytest

échantillon de test pytest


# -*- coding: utf-8 -*-
from __future__ import absolute_import, unicode_literals


#Fonction à tester
def add(a, b):
    return a + b


#Code de test Le nom de la fonction est test_Comment commencer avec pytest
def test_add():
    assert add(1, 1) == 2
    assert add(1, 2) != 2

Résultat d'exécution du pytest


>>> $ py.test ../tests/test_add.py 
=============================================================================== test session starts ===============================================================================
platform darwin -- Python 2.7.5 -- py-1.4.31 -- pytest-2.7.0
rootdir: /Users/***********, inifile: pytest.ini
plugins: cache, django, pep8, pythonpath
collected 2 items 

../tests/test_add.py ..

============================================================================ 2 passed in 0.06 seconds =============================================================================

La couverture des tests n'augmente pas

Au début, j'ai travaillé dur pour écrire un test unitaire, mais il semble que la charge du développeur soit lourde. On a l'impression d'essayer trop fort. Quand je l'ai consulté, il m'a conseillé de faire un test de boîte noire sur une base API Web au lieu d'un test basé sur la fonction sur un serveur Soshage. Quand je l'ai essayé, l'effort de développement était petit, simple et puissant. Je l'utilise toujours. La couverture du code ne s'est pas améliorée, mais les tests d'API Web peuvent couvrir l'API avec moins d'effort.

Cette méthode de test est particulièrement utile dans les langages de script, où vous trouverez souvent le type de bogues détectés au moment de la compilation.

Code Pytest pour tester l'API Web de style JSON


# -*- coding: utf-8 -*-
from __future__ import absolute_import, unicode_literals
import ujson
import requests


def test_api():
    #Tester l'API GitHub
    url = "https://api.github.com/repos/vmg/redcarpet/issues?state=closed"
    headers = {'Accept-Encoding': 'identity, deflate, compress, gzip',
               'Accept': '*/*', 'User-Agent': 'python-requests/1.2.0',
               'Content-type': 'application/json; charset=utf-8',
               }
    response = requests.get(url, headers=headers)
    #Le code d'état HTTP est 200
    assert response.status_code == 200

    #Être capable d'analyser BODY avec json
    data = ujson.loads(response.text)

    #URL dans le tableau, state, created_L'existence de l'élément de at
    for param in data:
        assert 'url' in param
        assert 'state' in param
        assert 'created_at' in param

résultat de l'exécution du test pytest


>>> $ py.test ../tests/test_webapi.py 
=============================================================================== test session starts ===============================================================================
platform darwin -- Python 2.7.5 -- py-1.4.31 -- pytest-2.7.0
rootdir: /Users/*****, inifile: pytest.ini
plugins: cache, django, pep8, pythonpath
collected 2 items 

../tests/test_webapi.py ..
============================================================================ 2 passed in 0.87 seconds =============================================================================

Teindre l'équipe de développement dans une culture de test

Une fois tous les tests API du serveur terminés, nous avons établi une règle à consulter au sein de l'équipe et rédiger le test API Web. Puisque pytest a un mécanisme simple, toute personne disposant d'un exemple de code pourrait facilement l'apprendre. Cependant, il faut beaucoup de temps pour faire un travail boueux, comme signaler dans la revue jusqu'à ce qu'il soit corrigé, exécuter des tests régulièrement et corriger les erreurs, et informer les nouveaux participants. (Si vous le connaissez, lancez-le régulièrement? Je pense que vous pensiez qu'il s'agissait d'un test automatique avec crochet de validation. À ce moment-là, je pensais l'introduire, mais j'ai oublié de l'introduire sans devenir trop lourd. Les problèmes qui en résultent seront décrits plus loin. )

-Enabled pour exécuter tous les tests avec une seule commande (écrite par shell) ・ Afin de se développer confortablement, tous les tests ont été exécutés en 60 secondes. ・ Il a été décidé que le test passerait la condition d'achèvement des travaux dans la procédure de construction de l'environnement local. ・ Confirmé que le test a réussi lors de la révision du code ・ Lors du développement d'une nouvelle fonction, il est indispensable qu'un test soit joint au moment de la révision du code. ・ J'ai effectué un test régulièrement et je leur ai demandé de le réparer ou de le réparer.

Le déploiement de la prière et les bugs ont été réduits dans la phase opérationnelle!

L'application a été lancée avec succès et une culture de test a pris racine au sein de l'équipe. Le développement est effectué sur une base de pull request, avec le code de test joint sans le signaler. En raison de l'échec du test, nous avons trouvé une dépendance entre le module nouvellement développé et le module qui était considéré comme hors de portée de l'influence, et nous avons pu éviter le bogue de production.

En tant que règle de fonctionnement, la liste de contrôle au moment du déploiement indique toujours clairement que l'exécution des tests est effectuée, de sorte que l'habitude d'exécuter des tests dès la phase de développement a pris racine parmi les membres.

Cette fois, diffuser la culture du test au sein de l'entreprise

J'ai proclamé qu'il serait bon de tenir une session d'étude en interne et d'écrire un test. La raison (l'une des) du succès de notre projet était que nous avons écrit du code de test. Surtout dans l'entreprise, c'était efficace car je pouvais partager le code de test réel.

Des tests qui ne finissent jamais, des tests qui ne s'exécutent pas

C'est un test du temps, et si vous continuez à l'utiliser pendant une longue période de temps, le code de test portera une dette technique. Un test enfant problématique qui doit être corrigé à chaque fois que vous apportez une modification, un test qui prend plus de 300 secondes pour s'exécuter une fois, et un code de test laissé en commentaire car une erreur s'est produite en raison d'un problème avec le code de test lui-même lors du déploiement à la hâte. Testez du code trop compliqué à corriger et vous ne savez pas ce que vous testez.

Une culture de test en déclin au sein de l'équipe

Cela fait un an que l'opération a commencé. Les tests qui se terminaient initialement en moins de 60 secondes prennent désormais 12 minutes. La règle pour exécuter le test lors du déploiement est également omise en raison de la latence. Beaucoup d'ingénieurs étaient des vétérans et l'équipe de débogage était excellente, donc les bogues n'ont pas augmenté. De nombreuses personnes ont écrit des tests pour la nouvelle demande d'extraction de module, mais la culture de test au sein du projet a décliné.

Les graines de la culture test poussent

En raison de l'influence de la session d'étude interne et du fait que certains ingénieurs avaient déjà écrit le code de test individuellement, même si j'avais l'intention de commencer par moi-même, le nombre de nouveaux projets qui adoptent progressivement l'écriture de test en règle générale augmente. est allé. Je fais un test! Je pense qu'il est important de dire cela.

fin




Rétrospective: où était le problème, l'équipe était-elle épuisée?

Si vous négligez d'implémenter la logique métier, cela ne fonctionnera pas selon les spécifications, il est donc essentiel de l'implémenter, mais c'est plutôt bien même si vous n'implémentez ni n'exécutez le code de test. Je pense que la raison pour laquelle la culture du test a décliné est que l'équipe de développement est épuisée par la maintenance du test, je vais donc noter où elle a été épuisée.

1-1. L'exécution des tests à la main ou l'exécution des tests dans l'environnement local n'est pas cool

Je pense que nous aurions dû relier le commit hook et jenkins, ou adopter TravisCI ou CircleCI et les tester automatiquement lorsqu'ils étaient validés. J'ai écrit sur l'utilisation de CircleCI dans Django dans cet article

1-2. Les tests de mauvaise qualité auraient dû être jetés

L'équipe était épuisée par la maintenance du test, qui dépend de manière compliquée des données de base et échoue une fois toutes les deux fois en raison du problème du test lui-même. Je pense que des tests de mauvaise qualité auraient dû être jetés et réécrits pour des raisons de métabolisme.

1-3. Les tests de longue durée sont omis

Je ne peux pas attendre un test qui prend plus de 60 secondes. Étant donné que le rythme de développement sera lent, je pense que nous aurions dû réfléchir davantage pour pouvoir développer confortablement en considérant l'exécution parallèle des tests et en la divisant en deux couches comme le test rapide et le test complet.

1-4. J'aurais dû laisser un commentaire sur la perspective que je testais

Bien qu'une erreur se produise s'il est exploité pendant une longue période de temps, le nombre de variables sera aligné et la personne qui l'a écrite sera éloignée du projet, il est donc nécessaire de quitter l'élément de test du point de vue du test. Je pense que c'était.

2. Savoir-faire pour écrire du code de test en équipe

2-1 Décrivez que l'essai se termine normalement dans la condition d'achèvement de la procédure de construction de l'environnement.

C'est une mesure efficace pour les nouveaux participants. Si vous vérifiez si le test a réussi pour chaque pull request même après la construction, il sera corrigé rapidement.

2-2. Le développement de pull request est efficace pour la rédaction du code de test en équipe

Si vous procédez au développement basé sur une pull request, le contrôle sera efficace, vous pouvez donc éviter la situation où le nombre de codes non testés augmente et l'effet pédagogique est grand.

2-3. Ne laissez pas un test cassé

Lorsqu'un échec de test se produit, personne ne verra le résultat du test, nous donnerons donc la priorité à sa correction. Si quelqu'un le corrige à plein temps, cela ne s'améliorera pas pour toujours, donc cela peut être bon pour l'éducation si vous le transportez en service.

2-4 Faites attention au temps d'exécution du test. Un test lent est mauvais

Si le temps d'exécution du test est lent, vous ne pourrez pas voir les résultats, vous devez donc prendre des mesures pour exécuter les tests en parallèle ou accélérer le test.

3. Perspectives sur la révision du code des tests

C'est le point de vue de vérifier la revue de code lors de la réception d'une pull request.

3-1 Le test réussit-il?

Automatisez ou vérifiez réellement pour vous assurer que le test réussit.

3-2 Le temps d'exécution du test est-il approprié?

Sauf si vous avez une raison spécifique, un test doit être effectué dans les 5 secondes. Vérifiez tous les tests qui prennent beaucoup de temps en termes de temps d'exécution.

3-3 Dépend-elle des données de base ou y a-t-il une valeur fixe?

Les valeurs fixes telles que card_id = 1 sont des dettes techniques qui entraîneront une erreur si l'ID change à l'avenir. Pointez pour charger la valeur de test dans les appareils au lieu de la valeur fixe, ou pour extraire l'ID d'autres API de récupération de données.

3-4 Y a-t-il des commentaires sur les éléments de test appropriés?

Vérifiez dans quelle perspective le test est décrit. Après une longue période de fonctionnement, les membres seront remplacés, donc même si une erreur se produit dans le test, la raison ne sera pas claire.

3-5 Y a-t-il une dépendance due à l'ordre d'exécution?

Si vous écrivez un test distinct, par exemple, enregistrez-vous puis supprimez, une dépendance se produira. S'il existe une dépendance sur l'ordre d'exécution du test, une erreur se produira lors de la parallélisation du test pour accélérer, donc s'il y a une dépendance, indiquez qu'elle doit être combinée en une seule.

Recommended Posts

Culture de code de test en interne à partir d'une seule personne
Renforcez avec le test de code ⑦
Renforcez avec le test de code ⑨
Renforcez avec le test de code ③
Renforcez avec le test de code ⑤
Renforcez avec le test de code ②
Renforcez avec le test de code ①
Renforcez avec le test de code ⑧
Renforcez avec le test de code ⑨
Automatisation des tests à partir de L-Chika (3) Incorporation d'un oscilloscope
Comment démarrer du code écrit en Atom avec une seule commande sans démarrer Teminal
Airtest, une question à la fois. Test E2E de l'application Unity commençant par Airtest et Poco