2017-05-19 3 views
-2

J'exécute des tests unitaires en Python3 mais le print() ne semble pas fonctionner.Python3 UnitTests: Comment imprimer sur stdout

Voici quelques extraits de mon code:

import unittest 

def lexer(line): 
     ... #Lots of code and print statements here 
    return tokens 

class lexerBasicTestCases(unittest.TestCase): 
    def Test1(self): 
     test = "9+4" 
     output = ["9", "+", "4"] 
     self.assertEqual(lexer(test), output) 
    def Test2(self): 
     test = "9 + 4" 
     output = ["9", "+", "4"] 
     self.assertEqual(lexer(test), output) 
    def Test2(self): 
     test = "9 + 4" 
     output = ["9", "+", "4"] 
     self.assertEqual(lexer(test), output) 

def lexerBasicTestSuite(): 
    suite = unittest.TestSuite() 
    suite.addTest(lexerBasicTestCases('Test1')) 
    suite.addTest(lexerBasicTestCases('Test2')) 
    suite.addTest(lexerBasicTestCases('Test3')) 
    unittest.TextTestRunner(verbosity=2).run(suite) 

#Main program 
lexerBasicTestSuite() 

je lance mon code à l'aide:

python \interpreter.py 

Lorsque les tests unitaires exécutés, les états d'impression() à l'intérieur lexer() sont ignorés. C'est frustrant lorsque les cas de test échouent et que je n'ai pas d'instructions d'impression à analyser. Lorsque je débogue, je préfère ne pas commenter les tests unitaires et écrire une fonction homologue qui exécute uniquement les tests pour leurs instructions d'impression. Comment puis-je imprimer les relevés d'impression?

+1

Bienvenue dans StackOverflow. Veuillez lire et suivre les consignes de publication dans la documentation d'aide. [Exemple minimal, complet, vérifiable] (http://stackoverflow.com/help/mcve) s'applique ici. Nous ne pouvons pas vous aider efficacement tant que vous n'afficherez pas votre code MCVE et que vous ne décrivez pas précisément le problème. Nous devrions pouvoir coller votre code posté dans un fichier texte et reproduire le problème que vous avez décrit. Au lieu de cela, vous avez * supprimé * le code de problème et * conservé * le code superflu. – Prune

+1

Vous ne voulez pas avoir des fonctions d'impression. Ce que vous voulez, c'est que les tests unitaires vérifient les valeurs de retour des fonctions. Vous pouvez facilement avoir d'autres fonctions qui impriment les valeurs de retour pendant l'exécution de votre code de production. L'impression en cours d'exécution de tests unitaires est un non-non. – quamrana

+1

Vous pouvez utiliser le module de journalisation pour cela. Peut être cela pourrait aider - https://stackoverflow.com/questions/284043/outputting-data-from-unit-test-in-python – Shashank

Répondre

0

Les tests unitaires s'exécutent en parallèle, vous ne pouvez donc pas vous fier à la fonction d'impression car elle n'est pas sécurisée pour les threads. Utilisez plutôt le logger, ou mieux passez un message personnalisé à la méthode assert.

class lexerBasicTestCases(unittest.TestCase): 
    def Test1(self): 
     """ 
     Docstrings are printed in most test runners. 
     """ 
     test = "9+4" 
     expect = ["9", "+", "4"] 
     failure_msg = 'lexer({0}) should return {1} but returned {2}' 
     actual = lexer(test) 
     self.assertListEqual(expect, actual, failure_msg.format(test, expect, actual))