既然您已经完成了构建简单命令行应用程序的过程,那么必要的下一步就是验证它是否确实按预期运行。编写代码只是开发过程的一部分;通过测试确保其正确性同样重要,即使是像您刚刚构建的这样的小项目也不例外。可以将测试视为一次质量检查,一种确保应用程序行为可预测并产生正确结果的方式。为什么要测试您的应用程序?本质上,测试能帮助您在代码中找到问题,这些问题通常被称为bug。通过使用不同的输入运行应用程序,您可以查看它是否正确处理了各种情况。例如,对于命令行工具,这可能意味着:正确性: 对于有效输入,它是否产生预期输出?如果您构建了一个计算器,2 + 2 实际结果是否为 4?健壮性: 它如何处理意外或无效输入?是崩溃、给出奇怪的错误信息,还是能友善地引导用户?完整性: 它是否实现了您计划的所有功能?及早发现错误,特别是在这些基础阶段,会比在更复杂的程序中后期发现并修复它们容易得多。手动测试:您的初步方法对于您当前阶段正在构建的应用程序,最直接的测试方式是手动测试。这包括您自己运行程序,并像用户一样与其交互。您将提供不同的输入并观察输出,然后将它们与您预期会发生的结果进行比较。制定基本测试用例为了有效测试,您需要一个计划。与其随意输入,不如思考特定的情景,或称之为测试用例,这会很有帮助。一个测试用例通常包含:输入: 您将提供给应用程序的数据或命令。预期结果: 应用程序对输入应该做什么或输出什么。考虑为不同类别的输入创建测试用例:典型用法(“正常路径”): 测试常见、预期的输入。如果是一个计算器,测试使用有效数字进行简单的加法、减法等。如果是一个任务列表,测试添加任务、查看列表,以及删除任务。这些测试确认核心功能正常运行。示例(计算器): 输入 2 + 3,预期输出 5示例(任务列表): 输入 add Buy milk,预期输出 任务 'Buy milk' 已添加。 (或类似的确认信息)边界条件(极端情况): 测试处于可接受范围极限的输入。允许的最大或最小数字会发生什么?如果相关,空输入又会怎样?示例(计算器,如果存在限制): 输入非常大的数字,输入 0。示例(任务列表): 输入 add(不带任务描述),输入 view 当列表为空时。无效输入(错误情况): 测试应用程序不应接受或应优雅处理的输入。如果用户在预期为数字的地方输入文本会怎样?如果他们输入了未知命令又会怎样?示例(计算器): 输入 two + three,输入 5 / 0(除以零)。示例(任务列表): 输入 remov Buy milk(命令拼写错误),输入 fly to the moon 这样无意义的命令。执行测试执行您的计划:从命令行运行您的应用程序。输入您的第一个测试用例。观察实际输出或行为。比较实际结果与预期结果。记录结果。通过还是失败了?如果失败了,记下输入、实际输出和预期输出。这些信息对调试非常有价值。对所有计划的测试用例重复上述步骤。示例测试情景(简单计算器工具)假设您的命令行工具是一个基本计算器,接受 add 5 3、sub 10 2 等输入。测试用例描述输入预期输出通过/失败备注基本加法add 5 38基本减法sub 10 28乘法mul 6 742除法div 10 52 (或 2.0 取决于实现)除以零div 8 0错误信息(例如,“不能除以零”)应用程序不应崩溃无效命令power 2 3错误信息(例如,“未知命令”)非数字参数add five 3错误信息(例如,“无效数字”)参数数量错误add 5错误信息(例如,“参数不正确”)空输入Enter用法帮助或提示取决于设计测试失败时:调试如果测试失败(实际结果与预期结果不符),您就找到了一个bug!不要气馁;这是编程的正常组成部分。下一步是调试:识别: 准确找出导致失败的输入和情况。定位: 检查代码中负责处理该输入或产生该输出的部分。如果需要,可以在代码中策略性地使用 print() 语句来查看变量在不同位置的值。修复: 修改代码以纠正逻辑错误。重新测试: 再次运行失败的测试用例以确保修复有效。重新运行其他相关测试用例也是明智之举,以确保您的修复没有引入新问题(这称为回归测试)。展望未来:告别手动测试手动测试是必要的,尤其是在您刚开始时。然而,随着应用程序变得越来越大、越来越复杂,每次小改动后都手动测试所有功能会变得耗时且容易出错。在更高级的开发中,程序员会使用自动化测试。这包括编写更多代码(测试代码),这些代码会自动使用预定义的输入运行应用程序代码的一部分,并检查输出是否正确。Python 有内置库,如 unittest,以及流行的第三方库,如 pytest,专门用于此目的。虽然自动化测试不在本入门课程的讨论范围之内,但它是您在继续编程学习时会遇到的一个重要主题。目前,认真对您的命令行工具进行手动测试将大幅提升其质量,并加深您对所学各个部分如何整合的理解。