【 python】 Internal Guide for Unit Test Practice

Moon ai 2021-10-29 09:18:41
python internal guide unit test

Pour les tests unitaires,Notre principe général est:

Les tests unitaires doivent être écrits,Parce que c'est ainsi que la qualité du programme est garantie et que les bonnes habitudes sont développées,Mais ne complique pas trop les tests unitaires,Consacrer trop d'énergie à ça,Alors c'est l'inverse.

pytestUtilisation simple de


Sélection de l'outil d'essai de l'unit épytest(Cet outil etgo testUn peu comme),Utilisation simple:

# Documentation: example.py
def func(i: int) -> int:
return i * 2
# Documentation: example_test.py
from .example import func
def test_func():
assert func(10) == 20
assert func(20) == 30

Exécuter la commande dans le même répertoirepytest,Cette commande trouve automatiquement*_test.pyDocuments(Attention!:Le répertoire actuel nécessite des fichiers__init__.py)Exécuter le cas d'essai.Apparemment, ce test d'Unit é a échoué,Les informations d'erreur sont les suivantes::

 def test_func():
assert func(10) == 20
> assert func(20) == 30
E assert 40 == 30
E + where 40 = func(20)
doctest_example_test.py:7: AssertionError

pytest Les fichiers de test peuvent être trouvés automatiquement Récursivement ,Pendant l'utilisation, L'exécution des cas d'utilisation spécifiés est également prise en charge :

  • Spécifier le chemin du fichier de test pytest /path/to/test/file.py
  • Spécifier la classe d'essai pytest /path/to/test/file.py:TestCase
  • Préciser la méthode d'essai pytest another.test::TestClass::test_method
  • Spécifier la fonction de test pytest /path/to/test/file.py:test_function

Plusieurs spécifications relatives aux essais unitaires


À propos des tests unitaires , Nous définissons plusieurs spécifications d'utilisation :

  1. Nous écrivons des fonctions ou des classes, etc , Pour rester testable en tout temps ( Ou un état observable ).
  2. Le nom de fichier du cas d'essai doit correspondre à ,Par exemple, le nom du fichier estfilename.py, Le nom du fichier de cas d'essai correspondant est filename_test.py.
  3. Le nom de la fonction d'essai doit correspondre à , Par exemple, la fonction d'affaires s'appelle func_name, La fonction d'essai correspondante est test_func_name.
  4. Le nom de la classe de test doit correspondre à , Par exemple, le nom original de la classe est ClassName, Le nom de la classe d'essai correspondante est TestClassName.
  5. Il est recommandé que les fichiers de cas d'essai et les fichiers fonctionnels soient placés dans le même répertoire ,Facile à trouver, En général, il n'est pas nécessaire d'avoir un répertoire de tests distinct .

Utiliser des tests paramétriques pour optimiser les cas d'essai


Dans la pratique, Nous devrions donner la priorité à l'utilisation de tests paramétriques :
# Le cas d'essai précédent aurait dû être optimisé pour :
import pytest
# La partie des données ici peut être définie comme une variable
# De cette façon, il n'est pas nécessaire d'écrire plusieurs fois assertLa déclaration est
@pytest.mark.parametrize("params, expected", [([10], 20), ([20], 30)])
def test_func2(params, expected):
assert func(*params) == expected
Encore une fois,Après exécution, Le test a aussi échoué :
 @pytest.mark.parametrize("params, expected", [([10], 20), ([20], 30)])
def test_func2(params, expected):
> assert func(*params) == expected
E assert 40 == 30
E + where 40 = func(*[20])
doctest_example_test.py:18: AssertionError

Si vous prenez çaparametrize Si la fonction est encapsulée , Ça devrait être plus facile , Par exemple, un test à l'unit é décrit simplement l'entrée et la sortie :

# Il suffit de se concentrer sur l'écriture des cas d'essai
test_data = [
(func, [10], {}, 20),
(func, [20], {}, 30)
]
@pytest.mark.parametrize("action, args, kwargs, expected", test_data)
def test_all_func(action, args, kwargs, expected):
assert action(*args, **kwargs) == expected
Voilà., Il suffit de se concentrer sur l'écriture des cas d'essai .

20210626

Cet article est partagé par Wechat public Number - SauvageAIArchitecte(Moon-CV) ,Auteur:La luneAI

La source originale et les informations reproduites sont détaillées dans le texte,En cas d'infraction,Veuillez contacter: [email protected] Supprimer.

Date de publication originale: 2021-06-26

Participation à cet articleTencent Cloud Self - media Sharing Plan,Bienvenue à la lecture,Partager ensemble.

版权声明
本文为[Moon ai]所创,转载请带上原文链接,感谢
https://pythonmana.com/2021/10/20211028160926588z.html

  1. J'ai utilisé Python pour ramper 1000 lettres d'amour pour aider mon colocataire à exprimer les fleurs de classe, mais les inverser et les inverser... C'est le secret ultime des fleurs de classe!
  2. python中列表转为矩阵后无法进行矩阵的乘法运算
  3. Python crawler Development and Learning full tutoriel 2nd Edition, banggan 100000 words [recommended Collection]
  4. Python crawler haut de gamme: microstore confus anti - décryptage
  5. La multiplication de la matrice ne peut pas être effectuée lorsque la liste est convertie en matrice en python
  6. Introduction to operators in python (Part 1)
  7. Are the dictionaries in Python ordered
  8. Introduction to dictionaries in Python
  9. List introduction in Python
  10. pandas比较两个dataframe特定数据列的数值是否相同并给出差值:使用np.where函数
  11. Python使用matplotlib绘制透明背景的可视化图像并保存透明背景的可视化结果(transparent background)
  12. Python self study notes -- basic grammar
  13. Python utilise matplotlib pour dessiner une image visuelle de l'arrière - plan transparent et enregistrer les résultats visuels de l'arrière - plan transparent
  14. Pandas compare les valeurs de deux colonnes de données spécifiques à dataframe et donne des valeurs de voyage: en utilisant la fonction np.where
  15. Comment configurer une application ASGI Django avec Postgres, nginx et uvicorn sur Ubuntu 20.04
  16. What are the advantages of Python and how to get started quickly
  17. Python self study notes -- basic data types
  18. Python code reading (Chapter 14): List Union
  19. Analyse statistique de la fonction de données des essais aléatoires Python
  20. Alien invasion project in Python application -- Aliens (Part 2)
  21. Python code reading (Chapter 14): List Union
  22. Lecture du Code Python (article 25): diviser les chaînes multilignes en listes
  23. Python self study notes -- operators
  24. Formation python - différences entre http et HTTPS
  25. Implementation of automatic timing comment function on Python CSDN platform
  26. python+tkinter+treeview子控件快捷键
  27. Raccourcis clavier pour les sous - contrôles Python + tkinter + treeview
  28. Analyse des données Python
  29. python+tkinter+treeview子控件快捷鍵
  30. Devine si je peux attraper Maotai avec la programmation python? Tout est ouvert à github
  31. À propos de pygame.display.set in Python Un petit problème avec mode ()
  32. Implementation of automatic timing comment function on Python CSDN platform
  33. python:dataframe进行iteritem遍历时如何将输出结果按照列分别输出为该列最后一行
  34. python:dataframe進行iteritem遍曆時如何將輸出結果按照列分別輸出為該列最後一行
  35. Python: comment le dataframe affiche les résultats de sortie par colonne à la dernière ligne de la colonne lors de la traversée de l'itemitem
  36. Écrivez un gadget de bureau pour votre fille préférée en python et elle dit que c'est génial!
  37. Introduction to closures in Python 3
  38. Global / nonlocal usage in Python 3
  39. Introduction to context manager in Python 3
  40. Python crawler selenium framework. You can start with these five questions | Python skill tree
  41. Common standard library random, python introductory tutorial 5 or 6 questions a day | Python skill tree
  42. It is said that Python is omnipotent. It's really good to see Liyang photography circle with Python this time
  43. 【Python 爬虫】 4、爬虫基本原理
  44. 【Python 爬蟲】 4、爬蟲基本原理
  45. 【 Python crawler】 4. Principes de base du crawler
  46. 这道python题到底应该要怎么做
  47. Que doit faire exactement ce problème Python
  48. Après l'importation des variables du module Python, les valeurs imprimées sont fixes.
  49. Nouveau singe Muzi Lee: 0 cours de formation Python de base types de hachage pour les opérations Python redis
  50. Looking at problems from a fresh perspective: analyzing selenium principle from the perspective of Python
  51. Insérez le format de date dans la base de données MySQL en python et ne l'exécutez pas.
  52. Try Python 3.10 with CONDA
  53. Répondez en python et demandez à quelqu'un de vous aider.
  54. Un simple problème de travail Python, qui ne fonctionne pas
  55. Problèmes d'écriture Python pour la boucle
  56. Comment Python exécute les commandes du programme à plusieurs reprises au lieu de quitter
  57. YYDS! Dexplot: one line of Python code to easily draw statistical charts!
  58. pandas生成的透视表如何和源数据一起保存
  59. pandas生成的透視錶如何和源數據一起保存
  60. Comment sauvegarder le tableau pivot généré par pandas avec les données sources