错误和测试
通常,程序员和程序开发人员花费大量时间进行调试和测试。很难给出准确的百分比,因为这在很大程度上取决于其他因素,例如个人编程风格、要解决的问题,当然还取决于程序员的资质。毫无疑问,编程语言是另一个重要因素。
正如古罗马人所知道的那样,您不必编写程序就会被错误所困扰。哲学家西塞罗在 2000 多年前创造了一个令人难忘的格言,经常被引用:“errare humanum est”* 这句格言经常被用作失败的借口。尽管几乎不可能完全消除软件产品中的所有错误,但我们应该始终为此雄心勃勃地工作,即将错误的数量保持在最低限度。
错误类型
有各种各样的错误。在程序开发过程中,有很多“小错误”,主要是错别字。是否缺少冒号——例如,在“if”或“else”后面——或者关键字“True”被错误地写成小写“t”都会产生很大的不同。这些错误被称为语法错误。** 在大多数情况下,很容易发现语法错误,但其他类型的错误更难解决。语义错误是句法上正确的代码,但程序并未按预期方式运行。假设有人想将变量 x 的值增加 1,但他或她写的不是“x += 1”,而是“x = 1”。以下较长的代码示例可能包含另一个语义错误:
x = int ( input ( "x? " ))
y = int ( input ( "y? " ))
if x > 10 :
if y == x :
print ( "Fine" )
else :
print ( "那又怎样?" )
输出:
所以呢?
我们可以看到两个 if 语句。一个嵌套在另一个里面。代码在语法上绝对是正确的。但是,如果变量 x 的值都大于 10 且 x 不等于 y,则程序编写者可能只想输出“那又怎样?”的情况。在这种情况下,代码应如下所示:
x = int ( input ( "x? " ))
y = int ( input ( "y? " ))
if x > 10 :
if y == x :
print ( "Fine" )
else :
print ( "那又怎样?" )
两个代码版本在语法上都是正确的,但其中之一违反了预期的语义。让我们再看一个例子:
对于 我 在 范围(7 ):
打印(我)
输出:
0
1
2
3
4
5
6
该语句运行时没有引发异常,因此我们知道它在语法上是正确的。尽管无法确定该语句在语义上是否正确,因为我们不知道问题所在。可能是程序员想输出从 1 到 7 的数字,即 1,2,...7 在这种情况下,他或她没有正确理解范围函数。
所以我们可以将语义错误分为两类。
- 由于缺乏对语言结构的理解而导致的错误。
- 由于逻辑上不正确的代码转换而导致的错误。
单元测试
本段是关于单元测试的。顾名思义,它们用于测试代码的单元或组件,通常是类或函数。基本概念是通过测试“小”单元来简化对大型编程系统的测试。为了实现这一点,程序的各个部分必须被隔离成独立的可测试“单元”。可以将“单元测试”定义为一种方法,通过该方法测试单个源代码单元以确定它们是否满足要求,即返回所有可能的或定义的输入数据的预期输出。一个单元可以被看作是程序中最小的可测试部分,它通常是来自类的函数或方法。测试一个单元应该独立于其他单元,因为一个单元“相当”小,即可以管理以确保完全正确。
带有名称的模块测试
每个模块都有一个名称,该名称在内置属性中定义__name__
。假设我们已经编写了一个模块“xyz”,并保存为“xyz.py”。如果我们使用“import xyz”导入这个模块,字符串“xyz”将被分配给__name__
。如果我们将文件 xyz.py 称为独立程序,即按照以下方式,
$python3 xyz.py
的值__name__
将是字符串'__main__'
。
以下模块可用于计算斐波那契数。但是模块在做什么并不重要。我们想演示如何在模块文件中创建一个简单的模块测试——在我们的例子中是文件“xyz.py”——通过使用 if 语句并检查__name__
. 我们检查模块已经启动独立,在这种情况下的价值__name__
会__main__
。请将以下代码保存为“fibonacci1.py”:
-斐波那契模块-
def fib ( n ):
""" 迭代计算第 n 个斐波那契数 """
a , b = 0 , 1
for i in range ( n ):
a , b = b , a + b
return a
def fiblist ( n ):
""" 创建一个斐波那契数列表,直到第 n 代 """
fib = [ 0 , 1 ]
for i in range ( 1, n ):
fib += [ fib [ - 1 ] + fib [ - 2 ]]
返回 fib
可以在交互式 Python shell 中手动测试此模块:
从 fibonacci1 导入 fib , fiblist
fib ( 0 )
输出:
fib 函数测试成功!