Recherchez - vous des informations de suivi dans le journal de projet python?

Xiao Peng gogogo 2021-10-06 14:20:39 阅读数:125

recherchez vous des informations suivi

Préface

J'ai récemment rencontré un extrait de recherche lors d'une entrevue pour un poste de développement de test Python Problèmes de journalisation,C'était un peu confus,Aucune solution raisonnable n'a été trouvée,Après l'entrevue, j'ai réfléchi,La collecte des journaux d'erreurs est courante dans les projets,Dans le travail quotidien peut également aider les étudiants de test à améliorer l'efficacité des tests,Alors j'ai écrit cet article.

Problèmes et solutions

La description du problème est la suivante:

Pour vous donner un grand Python Log,Comment trouver Traceback Information?

C'est très réaliste de découvrir ce problème?Parce que nous savons tous,C'est un processus qui va du développement fonctionnel à la mise à l'essai en ligne error_log,J'ai récemment rencontré un extrait de recherche lors d'une entrevue pour un poste de développement de test Traceback Le contenu est sorti dans un journal.Cette fonctionnalité peut être réalisée de plusieurs façons,Y compris: Python Fourni traceback La bibliothèque peut aussi.Est - ce que cette question a un sens pratique?Donc, du point de vue de la réalisation et de l'exécution du projet,Cette fonction n'a aucun sens.

Mais du point de vue des tests,Est d'une certaine utilité,Par exemple,,Les projets des grandes entreprises en général,C'est - à - dire qu'une erreur dans l'exécution d'un programme de projet est:

log.drawio.png

Parmi eux,showcase Il s'agit principalement de montrer aux élèves si les fonctions de base du système sont activées ; La mise à l'essai vise principalement à résoudre showcase Problèmes trouvés dans . Si ces processus précédents sont mieux gérés , Les tests ultérieurs et la mise en ligne peuvent être plus fluides .

Mais il y a toujours quelque chose qui arrive au cours des tests bug,Ces bug In showcase Et ce n'est pas très bien vu dans le processus de mise à l'essai ,Et ça bug Ça arrive souvent Traceback De.Quand rd Les tests sont généralement effectués à l'aide de votre propre développeur ou environnement de test , Ces environnements ne peuvent pas envoyer Senty À IM Sur le logiciel(Par exemple:Lark,Clous), Donc ça mène à bug Passer à la phase d'essai ou en ligne .Si dans showcase Et le processus de mise à l'essai a résolu ce problème , Pour améliorer la qualité de la mesure ,Améliorer l'efficacité des essais, Réduire le processus de suivi bug Possibilité d'émergence.Alors..., En résumé, cette question a encore un certain sens pratique .

Et celui - là? Python À quoi ressemble le contenu du Journal ? J'offre ici un contenu qui pourrait apparaître .

asdfghjkl
1234567890
Traceback (most recent call last):
File "<doctest...>", line 10, in <module>
lumberjack()
File "<doctest...>", line 4, in lumberjack
bright_side_of_death()
IndexError: tuple index out of range
qwertyuiop
Traceback (most recent call last):
File "<doctest...>", line 10, in <module>
lumberjack()
File "<doctest...>", line 4, in lumberjack
bright_side_of_death()
IndexError: tuple index out of range
zxcvbnm
9876543210
Traceback (most recent call last):
File "<doctest...>", line 10, in <module>
lumberjack()
File "<doctest...>", line 4, in lumberjack
bright_side_of_death()
IndexError: tuple index out of range
Copier le Code

Je vois., Le journal contient des informations générales et Traceback Information, Il y a un saut de ligne après chaque ligne dans le journal .

Pendant l'entrevue, Pour proposer rapidement des solutions , Peut - être que la première façon dont la plupart des gens pensent est d'utiliser Linux Les ordres,Par exemple: grep Commande pour la requête.

Mais grep En général, les commandes ne peuvent être utilisées que pour des mots - clés de requête simples , Sortie du contenu de la ligne ,Mais Traceback L'information s'étend sur plusieurs lignes ( Il y a \n),Alors utilisez grep Les commandes sont plus difficiles à trouver , La solution la plus imaginable en peu de temps est ,Produits Traceback Combien de lignes sous ,Par exemple::

cat xxx grep -A 10 Traceback
Copier le Code

Cela permet de produire Traceback Et après 10 D'accord. Il est clair que la méthode ne répond pas aux besoins .

La deuxième façon de penser est d'utiliser des expressions régulières . Cette approche est réalisable , Mais il faut d'abord analyser Traceback La régularité du contenu ,Deuxièmement,, Pour écrire des expressions régulières plus complexes ,Parce que, Il peut y avoir plusieurs lignes dans le texte qui correspondent à l'expression positive que vous avez définie , Et avec des ressources limitées , Donc ce n'est pas particulièrement raisonnable .

Voici une solution à laquelle je pense .

log2.drawio.png

Les codes sont les suivants::

import re
def collect_traceback(source: str, target: str) -> None:
"""CollectePythonDans le journalTracebackInformation, Et écrit dans le fichier cible :param source: Chemin du fichier journal :param taregt: Chemin du fichier de sortie des résultats :return: None """
# Stockage avec structure de pile 1Article (s)TracebackMessage d'erreur
error_stack = []
# RegularTraceback Expressions régulières au début et à la fin 
trac_start_regx = re.compile(r'(^Traceback \(most recent call last\):)\n')
trac_end_regx = re.compile(r'(^((\w)*Error): (\w)*)\n')
with open(source, 'r') as f:
# Indique que le traitement est en cours Traceback Identification du message 
handle_trac = False
for line in f:
if handle_trac:
# Mettre le message d'erreur sur la pile 
# Si le message d'erreur se termine , Erreur de sortie dans le fichier cible ,Vider la pile
# Réinitialiserhandle_tracIdentification
error_stack.append(line)
if trac_end_regx.search(line):
while len(error_stack) > 0:
error_info = error_stack.pop()
write_and_appending_trac_info(target, error_info)
handle_trac = False
elif trac_start_regx.search(line):
handle_trac = True
error_stack.append(line)
def write_and_appending_trac_info(target: str, error: str) -> None:
"""ParappendingComment écrireTraceback Information dans le fichier cible :param target: Chemin du fichier de sortie des résultats :param error: Message d'erreur à écrire :return: None """
with open(target, 'a') as f:
f.write(error)
if __name__ == '__main__':
collect_traceback('./error_info', './traceback_result')
Copier le Code

L'idée centrale du Code est d'utiliser une structure de pile pour stocker Traceback Information,Traceback Le début et la fin de la pile correspondent au bas et au Haut de la pile , Déterminer si le message d'erreur est actuellement traité par un identificateur , Chaque fois que vous rencontrez Traceback Commencez par la pile , Chaque fois que vous rencontrez Traceback Sortez de la pile à la fin ,Produits.

Les résultats de la procédure sont les suivants :

Traceback (most recent call last):
File "<doctest...>", line 10, in <module>
lumberjack()
File "<doctest...>", line 4, in lumberjack
bright_side_of_death()
IndexError: tuple index out of range
Traceback (most recent call last):
File "<doctest...>", line 10, in <module>
lumberjack()
File "<doctest...>", line 4, in lumberjack
bright_side_of_death()
IndexError: tuple index out of range
Traceback (most recent call last):
File "<doctest...>", line 10, in <module>
lumberjack()
File "<doctest...>", line 4, in lumberjack
bright_side_of_death()
IndexError: tuple index out of range
Copier le Code

Analyse

Cette solution est comparée à la méthode d'expression régulière , Il y a deux avantages :

  • Tout d'abord,, Les règles d'extraction des chaînes sont plus simples , Il suffit de considérer les expressions régulières pour les lignes de début et de fin .
  • Deuxièmement,, Pas limité par les ressources de mémoire , Dans un cas extrême , Il y a beaucoup de contenu dans le journal , Pour utiliser la méthode régulière, vous devez d'abord charger le contenu du fichier en mémoire , Il y a un problème de mémoire insuffisante .

Résumé

Voici un aperçu Python Dans le journal Traceback Procédure d'information , La résolution de ce problème peut aider les étudiants en développement à trouver rapidement des problèmes dans le programme ,Améliorer l’efficacité de la recherche et du développement. Si le lecteur veut être réel maintenant Java Afficher les messages d'erreur dans le projet ou dans une autre langue , Il peut également être nécessaire de modifier l'expression régulière en fonction du format du Journal .

Il y a plusieurs façons de résoudre ce problème , C'est juste une introduction à la pensée , Peut - être plus élégant ,Solutions efficaces, J'espère également que les lecteurs pourront commenter , Fournir des solutions plus réalistes .

Mots clés:Python;Traceback;Erreur;Log;

Copyright:Cet article est[Xiao Peng gogogo]Établi,Veuillez apporter le lien original pour réimprimer,remercier。 https://fra.fheadline.com/2021/10/20211006142033809d.html