测试能让您确信代码按预期运行。在本教程中,我们将使用 Python 学习测试驱动开发(TTD)的基础。首先,我们会介绍一些测试驱动开发的背景——它是什么,以及为何在写代码之前先写测试会有帮助。我们将采用“先测试”的方法:先为要实现的功能编写会失败的测试用例,再去编写实际函数。
教程先修要求
学习本教程,您需要具备 Python 的基础知识;如果想先复习,可以查看这门课程:Introduction to Python for Developers 。
先测试的方式能帮助我们思考期望的行为和输出。您可以使用多种库在 Python 中进行测试,例如 pytest 和 unnitest 。不过,现在我们将专注于使用原生 Python 编写简单测试用例,以验证目标功能是否产生了预期结果。
我们将从一个简单的测试用例开始,并逐步扩展测试用例以覆盖不同情景。随着测试用例的扩展,我们可能会发现最初实现逻辑中的缺陷或空白,需要加以改进。不断编写更进阶的测试、看到它们失败、再回去改进实现的这一迭代过程,正是 Python 测试驱动开发的核心。
在本教程中,我们将使用 DataLab ,这是 DataCamp 的云端数据笔记本,让您无需本地安装即可编写并运行 Python 代码。让我们开始吧!
从 DataLab 上手
在开始测试驱动开发之前,我们需要先熟悉 DataLab,并了解如何使用它来助力我们的学习之旅。打开 DataLab,您会注意到有许多选项。现在,我们将专注于在 DataLab 中编写 Python。
如果您选择 Python,工作簿会打开一个代码单元,供您编写 Python,界面大致如下:
这里有一些实用选项。例如,您可以运行该单元以生成输出,添加注释或笔记来辅助学习,并利用 AI 来帮助您起步或排除障碍。您还可以按需添加或删除任意数量的单元。我们将重点关注使用“Run”选项来运行单元。如下方代码所示,当您运行单元时,代码产生的任何输出都会记录在下方。
快速提示: 如果您使用了多个单元,并在一个单元中定义了变量,但尝试在另一个单元中访问它,您需要分别运行每个单元,或运行整个工作簿(通过工作簿右上角的“Run”按钮)。
既然已经掌握了 DataLab 的基础,用测试驱动开发来动手实践吧。
测试驱动开发
测试驱动开发的含义是先为代码编写测试,再编写代码本身。为了解释 TTD,我们从一个非常简单的例子开始:编写一个把数字相加的 Python 脚本。不过,在编写函数之前,我们会先写一个测试,检查 1 + 1 是否等于 2。您可以使用原生 Python 完成这件事,如下所示。
assert 1 + 1 == 2 技术支持
Python 中的 assert 关键字用于编写测试用例并确认程序条件是否为 True。它可以用于验证代码的行为和输出。当 assert 语句失败时,会抛出 AssertionError,提示代码存在问题。在 DataLab 工作簿中看起来如下:
示例 1:测试一个简单函数
我们先从测试函数开始。首先,在 DataLab 中打开一个 Python 文件。测试驱动开发强调先写会失败的测试。因此,让我们通过调用尚未定义的 add() 函数来编写一个会失败的测试。
assert add( 1 , 1 ) == 2
技术支持
这将导致 NameError,表明还没有实现,这被称为“红灯”步骤。当您尝试调用未定义的函数或变量时,会出现 NameError。
现在,是时候来实现这个函数了。我们可以通过定义该函数来完成:
def add(num1, num2):
return技术支持
我们定义了函数 add,它接收两个参数 num1 和 num2。目前我们的函数尚未返回任何内容。让我们看看当前的实现能否通过测试!
我们不再看到 NameError。然而,运行该单元仍然产生了错误!这次是 AssertionError。也就是说测试仍然失败!为什么会出现这个错误?这是因为我们定义了一个还没有返回任何内容的函数。
运行测试时,我们得到 AssertionError,因为在我们的空实现中,1 + 1 并不等于 2。最后,我们可以通过在函数中正确实现逻辑来使其通过。
您会注意到单元格角落的绿色圆点。这表明当您运行单元时,代码是有效的并已通过。此前,您会看到它是红色的并伴随运行错误,同时在单元格下方显示错误类型。这个功能对在 DataLab 中调试代码非常有用。
您现在已经使用测试驱动开发在 Python 中编写了第一个测试。做得好!接下来我们将继续扩展测试,并考虑捕获那些可能导致函数失败或无法产生预期输出的潜在错误。
示例 2:多个测试用例
只用一个输入值进行测试往往无法暴露潜在错误。缺陷很容易被隐藏,尤其当您的函数依赖于可变的用户输入或外部逻辑时。那么,如何充分地用多个值来测试一个函数呢?
例如,如果传入了错误的数据类型会怎样?您可以使用 Python 的测试框架,但我们先用基础的 Python。首先,我将定义一个由字典组成的列表,以模拟不同的使用场景:
test_cases = [
{ "num1" : 1 , "num2" : 3 , "expected" : 4 } ,
{ "num1" : 1 , "num2" : "invalid" , "expected" : "Error: num2 must be a number" } ,
{ "num1" : [ 1 , 2 , 3 ] , "num2" : 2 , "expected" : "Error: num1 must be a number" } ,
{ "num1" : - 1 , "num2" : 1 , "expected" : 0 } ,
{ "num1" : 3.5 , "num2" : 2.5 , "expected" : 6.0 } ,
{ "num1" : 100 , "num2" : 200 , "expected" : 300 }
]
技术支持
以上代码展示了函数的输入及对应的期望输出。不过,我们需要更新测试以遍历这些测试用例。我们可以通过在 for 循环中嵌套 assert 来验证列表中的每个字典。
for test in test_cases:
assert add(test["num1"], test["num2"]) == test["expected"]技术支持
由于函数尚未改变,您预计这个测试会通过还是失败?可能会出现什么错误?
测试抛出了 TypeError,因为我们还没有处理非数值输入;如果传入的是字符串或布尔值而不是 int,会怎么办?我们可以更新函数来捕获这些情况!通过检查输入变量是否为整数或浮点数,我们可以在类型无效时返回自定义消息。
def add ( num1, num2) :
if type ( num1) is not int and type ( num1) is not float :
return "Error: num1 must be a number"
elif type ( num2) is not int and type ( num2) is not float :
return "Error: num2 must be a number"
else :
return num1 + num2技术支持
当我们重新运行测试时,不再出现错误,测试已经通过。现在绿色圆点表明我们已经实现了一些通过的测试。干得好!
结语
在本教程中,我们使用 DataLab 介绍了 Python 中测试驱动开发的基础。DataLab 提供云端 IDE,让您无需本地安装即可编写并运行 Python 代码。测试用于验证代码行为并及早发现错误。Assert 语句用于检查条件,并在失败时抛出异常。
您可以在 DataLab 中继续探索更多测试用例,并开始编写属于您的测试!如果您想进一步学习 Python 测试,请查看我们的 DataCamp 课程——Introduction to Testing in Python 。
测试能让您确信代码按预期运行。在本教程中,我们将使用 Python 学习测试驱动开发(TTD)的基础。首先,我们会介绍一些测试驱动开发的背景——它是什么,以及为何在写代码之前先写测试会有帮助。我们将采用“先测试”的方法:先为要实现的功能编写会失败的测试用例,再去编写实际函数。
教程先修要求
学习本教程,您需要具备 Python 的基础知识;如果想先复习,可以查看这门课程:Introduction to Python for Developers。
先测试的方式能帮助我们思考期望的行为和输出。您可以使用多种库在 Python 中进行测试,例如 pytest 和 unnitest。不过,现在我们将专注于使用原生 Python 编写简单测试用例,以验证目标功能是否产生了预期结果。
我们将从一个简单的测试用例开始,并逐步扩展测试用例以覆盖不同情景。随着测试用例的扩展,我们可能会发现最初实现逻辑中的缺陷或空白,需要加以改进。不断编写更进阶的测试、看到它们失败、再回去改进实现的这一迭代过程,正是 Python 测试驱动开发的核心。
在本教程中,我们将使用 DataLab,这是 DataCamp 的云端数据笔记本,让您无需本地安装即可编写并运行 Python 代码。让我们开始吧!
从 DataLab 上手
在开始测试驱动开发之前,我们需要先熟悉 DataLab,并了解如何使用它来助力我们的学习之旅。打开 DataLab,您会注意到有许多选项。现在,我们将专注于在 DataLab 中编写 Python。
如果您选择 Python,工作簿会打开一个代码单元,供您编写 Python,界面大致如下:
这里有一些实用选项。例如,您可以运行该单元以生成输出,添加注释或笔记来辅助学习,并利用 AI 来帮助您起步或排除障碍。您还可以按需添加或删除任意数量的单元。我们将重点关注使用“Run”选项来运行单元。如下方代码所示,当您运行单元时,代码产生的任何输出都会记录在下方。
快速提示:如果您使用了多个单元,并在一个单元中定义了变量,但尝试在另一个单元中访问它,您需要分别运行每个单元,或运行整个工作簿(通过工作簿右上角的“Run”按钮)。
既然已经掌握了 DataLab 的基础,用测试驱动开发来动手实践吧。
测试驱动开发
测试驱动开发的含义是先为代码编写测试,再编写代码本身。为了解释 TTD,我们从一个非常简单的例子开始:编写一个把数字相加的 Python 脚本。不过,在编写函数之前,我们会先写一个测试,检查 1 + 1 是否等于 2。您可以使用原生 Python 完成这件事,如下所示。
Python 中的
assert关键字用于编写测试用例并确认程序条件是否为 True。它可以用于验证代码的行为和输出。当assert语句失败时,会抛出AssertionError,提示代码存在问题。在 DataLab 工作簿中看起来如下:示例 1:测试一个简单函数
我们先从测试函数开始。首先,在 DataLab 中打开一个 Python 文件。测试驱动开发强调先写会失败的测试。因此,让我们通过调用尚未定义的 add() 函数来编写一个会失败的测试。
这将导致
NameError,表明还没有实现,这被称为“红灯”步骤。当您尝试调用未定义的函数或变量时,会出现NameError。现在,是时候来实现这个函数了。我们可以通过定义该函数来完成:
我们定义了函数
add,它接收两个参数num1和num2。目前我们的函数尚未返回任何内容。让我们看看当前的实现能否通过测试!我们不再看到
NameError。然而,运行该单元仍然产生了错误!这次是AssertionError。也就是说测试仍然失败!为什么会出现这个错误?这是因为我们定义了一个还没有返回任何内容的函数。运行测试时,我们得到
AssertionError,因为在我们的空实现中,1 + 1 并不等于 2。最后,我们可以通过在函数中正确实现逻辑来使其通过。您会注意到单元格角落的绿色圆点。这表明当您运行单元时,代码是有效的并已通过。此前,您会看到它是红色的并伴随运行错误,同时在单元格下方显示错误类型。这个功能对在 DataLab 中调试代码非常有用。
您现在已经使用测试驱动开发在 Python 中编写了第一个测试。做得好!接下来我们将继续扩展测试,并考虑捕获那些可能导致函数失败或无法产生预期输出的潜在错误。
示例 2:多个测试用例
只用一个输入值进行测试往往无法暴露潜在错误。缺陷很容易被隐藏,尤其当您的函数依赖于可变的用户输入或外部逻辑时。那么,如何充分地用多个值来测试一个函数呢?
例如,如果传入了错误的数据类型会怎样?您可以使用 Python 的测试框架,但我们先用基础的 Python。首先,我将定义一个由字典组成的列表,以模拟不同的使用场景:
以上代码展示了函数的输入及对应的期望输出。不过,我们需要更新测试以遍历这些测试用例。我们可以通过在 for 循环中嵌套 assert 来验证列表中的每个字典。
由于函数尚未改变,您预计这个测试会通过还是失败?可能会出现什么错误?
测试抛出了
TypeError,因为我们还没有处理非数值输入;如果传入的是字符串或布尔值而不是 int,会怎么办?我们可以更新函数来捕获这些情况!通过检查输入变量是否为整数或浮点数,我们可以在类型无效时返回自定义消息。当我们重新运行测试时,不再出现错误,测试已经通过。现在绿色圆点表明我们已经实现了一些通过的测试。干得好!
结语
在本教程中,我们使用 DataLab 介绍了 Python 中测试驱动开发的基础。DataLab 提供云端 IDE,让您无需本地安装即可编写并运行 Python 代码。测试用于验证代码行为并及早发现错误。Assert 语句用于检查条件,并在失败时抛出异常。
您可以在 DataLab 中继续探索更多测试用例,并开始编写属于您的测试!如果您想进一步学习 Python 测试,请查看我们的 DataCamp 课程——Introduction to Testing in Python。