paint-brush
了解 Python 中的单元测试经过@terieyenike
3,048 讀數
3,048 讀數

了解 Python 中的单元测试

经过 Teri6m2022/09/04
Read on Terminal Reader
Read this story w/o Javascript

太長; 讀書

测试您的代码是软件开发生命周期的重要组成部分,它应该始终在将应用程序部署到生产之前进行。单元测试是程序员为测试代码库而编写的逻辑程序。测试至关重要,因为它有助于跟踪和发现代码中的错误。本文将教您如何使用 Python 单元测试编写基本测试,以检查您的代码在测试过程中是通过还是失败。单元测试的主要目的是检查所有代码功能是否按预期执行。
featured image - 了解 Python 中的单元测试
Teri HackerNoon profile picture


测试您的代码是软件开发生命周期的重要组成部分,它应该始终在将应用程序部署到生产之前进行。测试至关重要,因为它有助于跟踪和发现代码中的错误。


测试是一种在将代码交付生产之前检查各个源代码单元以确认其工作最佳的方法。需要注意的是,在单元测试期间,无需为用户将源文件部署到生产环境中。


如果您还记得测试不是特定于 Python 的,那将是最好的。


本文将教您如何使用 Python 单元测试编写基本测试,以检查您的代码在测试过程中是通过还是失败。


先决条件

要完成本教程,您需要以下内容:

  • 编写Python代码的知识
  • 的安装Python程序在您的本地机器上
  • 您选择的代码编辑器


入门

编写测试是程序员为测试代码库而编写的逻辑程序。在开发过程中,QA 应该了解流程,在将产品交付给用户之前突出应用程序中需要改进的地方。为此,让我们编写一个将两个数字相加并返回结果的函数。

首先,创建一个文件夹,其中包含用于编写本教程中的测试的所有文件。添加一个名为main.py的文件以在这个新文件夹中编写函数。


 # main.py # Add the sum of two numbers def add_sum(num1, num2): return int(num1) + int(num2)


现在我们有了上面的代码块,让我们通过编写一个允许用户通过输入提示输入所需值的函数来检查代码是否有效。函数add_sum()将两个数字作为参数,并使用运算符+符号返回值以获得总和。在另一个文件result.py中,复制并粘贴以下代码:


 # result.py from main import add_sum print("Please enter the two values\n") num1 = int(input("Please enter the first number: \n")) num2 = int(input("Please enter the second number: \n")) total = add_sum(num1, num2) print(f"The sum of the values is {total}")


此代码块执行以下操作:

  • main.py导入add_sum()
  • 使用int方法将输入提示值转换为整数
  • 使用 f 字符串(格式化语法)对打印其总数的值求和以获得输出


什么是单元测试和测试用例?

Python 带有一个名为 unittest 的内置标准库模块,它提供了为您的代码构建和运行测试的工具。单元测试的主要目的是检查所有代码功能是否按预期执行。


测试用例是使用单元测试的标准方式,其功能在测试名称类中可用。此外,对于单个单元测试,测试用例在组件代码中是必不可少的。它使用不同的断言方法在运行代码后立即检查和报告故障。


通过测试

本节是关于编写一系列测试的。


在创建用于编写add_sum()函数的所有测试用例的测试文件之前,让我们更新main.py 。复制并粘贴以下代码:

 # main.py def add_sum(num1, num2): try: return int(num1) + int(num2) except ValueError as err: return err


代码块使用try/except语句来处理代码中的异常,如果 except 块中存在错误,则会向您发出警报。编程中的这种方法有助于捕获错误并将您指向发生错误的特定行号。


现在,在名为 test.py 的同一目录中创建一个测试文件。在此文件中,复制并粘贴以下代码:


 # test.py import unittest from main import add_sum class MainTest(unittest.TestCase): def test_do_stuff(self): result = add_sum(5, 10) self.assertEqual(result, 15) if __name__ == '__main__': unittest.main()


如上面的代码块所示,会发生以下情况:

  • 导入要测试的unittest和函数(来自main.py)
  • Unittest 通过创建一个包含 add_sum() 函数测试的类来工作,该函数在类内部继承了 unittest 给出的内容,即 unittest.TestCase
  • 在 test_do_stuff() 中使用 self 关键字定义一个函数,该函数代表该类的实例
  • 在 test_do_stuff() 测试方法中,声明一个变量并传入两个具有不同值的参数
  • 最后一行使用 unittest 断言方法 assertEqual,它验证您从结果变量传递的参数是否与您期望接收的结果匹配
  • 最后,使用 unittest.main() 运行整个测试文件


当 test.py 自动运行时,请记住以“test_”开始每个方法。 **
**


每当您运行测试时,所有检查都应通过控制台中的 OK 消息,这意味着它是成功的。


 Ran 1 test in 0.000s OK


考试不及格

在开发和测试过程中,应该有失败的场景。这样做表明每个程序都有漏洞和错误。


在同一个文件test.py中,让我们修改代码并粘贴以下内容:


 # test.py import unittest from main import add_sum class MainTest(unittest.TestCase): # other test def test_do_stuff2(self): result = add_sum("hulu", 5) self.assertEqual(result, 5) if __name__ == '__main__': unittest.main()


运行此代码的结果如下所示:


 FAIL: test_do_stuff2 (__main__.MainTest) ---------------------------------------------------------------------- Traceback (most recent call last): File "test.py", line 11, in test_do_stuff3 self.assertEqual(result, 5) AssertionError: ValueError("invalid literal for int() with base 10: 'hulu'") != 5


从上面的输出中,可以通过读取错误代码并相应地更正代码来解决以下问题:

  • 错误发生在特定的行号上,告诉您检查并解决行号。
  • 接下来是断言错误,它给出了一个值错误,表示字符串 'hulu' 不是有效的文字,知道在 main.py 文件中,这两个值的类型为 int
  • 通过此步骤,您知道要更正什么以使代码运行测试 OK,并传递正确的值以使代码成功。


运行代码

当您创建了许多文件和不同的模块,并且您需要同时测试所有这些而不是默认尝试单个文件时,您可以使用此命令同时运行所有测试。


 python3 -m unittest


此外,要获取有关测试的更多详细信息,请使用带有标志-v (详细)的命令,它会向您显示正常的测试和失败的测试。


 python3 -m unittest -v


结果如下所示:


 test_do_stuff (test.MainTest) ... ok test_do_stuff2 (test.MainTest) ... ok ---------------------------------------------------------------------- Ran 2 tests in 0.000s OK


结论

每当在用户使用应用程序之前发布新功能时,单元测试应该由参与编写和交付代码的 QA 和开发人员进行。定期或定期进行测试不应该是事后的想法,而是要建立对应用程序的功能和效率的信任。


本文概述了为什么测试在开发中必不可少,以及如何使用单元测试来检查代码功能并在部署到生产之前满足用户的标准规范。


学到更多