软件测试 python,python代码测试工具
在编写函数或类时,可以编写测试来确保代码在面对各种输入时按要求工作。1.1 测试函数
编写一个简单的函数作为下面的测试代码。该函数接收名称并返回完整的名称。例子如下:
写一个使用这个函数的程序。例子如下:
执行结果:
(1)单元测试和测试用例
Python标准库中的模块unittest提供了代码测试工具。单元测试用于验证函数的某些方面没有问题;一个测试用例是一组单元测试,它们一起验证一个功能的行为是否满足各种情况下的需求。一个好的测试用例考虑了一个函数可能接收到的所有类型的输入,包括所有这些情况的测试。全覆盖测试用例包含一套完整的单元测试,覆盖所有可能的功能。对于大型项目,可能很难做到全覆盖。通常一开始只需要针对代码的重要行为编写测试,等项目广泛使用后再考虑全覆盖。
(二)能通过考试。
需要一段时间来习惯创建测试用例的语法,但是在测试用例被创建之后,为函数添加单元测试是非常简单的。要为函数编写测试用例,可以首先导入模块unittest和要测试的函数,然后创建一个继承unittest的类。TestCase,并编写一系列方法来测试函数行为的不同方面。下面是一个只包含一个方法的测试用例,它检查函数get_formatted_name()在给定名字和姓氏的情况下是否正常工作。例子如下:
首先,我们导入了要测试的模块unittest和函数get_formatted_name()。我们已经创建了一个名为NamesTestCase的类来包含get_formatted_name()的一系列单元测试。您可以随意命名这个类,但是最好使它看起来与要测试的函数相关,并包含单词test。该类必须继承unittest。TestCase类,以便Python知道如何运行您编写的测试。NamesTestCase只包含一个方法来测试get_formatted_name()的一个方面。我们将这个方法命名为test_first_last_name(),因为我们想验证是否只有名和姓的格式正确。当我们运行testname_function.py时,所有以test开头的方法都会自动运行。在这个方法中,我们调用要测试的函数并存储要测试的返回值。在本例中,我们使用参数“janis”和“joplin”调用get_formatted_name(),并将结果存储在变量formatted_name中。我们使用了unittest类最有用的函数之一:断言方法。断言方法用于验证得到的结果是否与预期的结果一致。这里我们知道GET _ FORMATED _ NAME()应该返回这样的名字,也就是名字和姓氏的第一个字母大写,中间有一个空格,所以我们期待FORMATED _ NAME的值的詹尼斯乔普林。为了检查是否是这种情况,我们调用unittest的方法assertEqual()并传递它formatted_name和詹尼斯乔普林。行self . assert equal(formatted_name,詹尼斯乔普林)表示:“将formatted _ name的值与字符串詹尼斯乔普林进行比较。如果他们是平等的,一切都会好的。如果他们不是,让我知道!”
执行结果:
(3)失败的测试
测试失败的结果是什么?我们来修改GET _ FORMATED _ NAME()让它可以处理中间名,但是我们这么做的时候故意让这个函数无法正确处理像张三这种只有名和姓的名字。下面是函数get_formatted_name()的新版本,它要求中间名由一个参数指定。例子如下:
执行结果:
(4)测试失败怎么办?
测试失败了怎么办?如果你检查的条件是正确的,通过测试意味着函数行为正确,而测试失败意味着你写的新代码是错误的。所以,当测试失败时,不要修改测试,而是修复导致测试失败的代码:检查刚才对函数所做的修改,找出导致函数行为不符合预期的修改。在这个例子中,get_formatted_name()过去只需要两个参数,——和姓氏,但现在它需要名字、中间名和姓氏。新添加的中间名参数是必需的,这导致了get_formatted_name()的意外行为。就此而言,最好的选择是让中间名可选。这样做之后,当用一个像詹尼斯乔普林这样的名字测试时,测试就通过了,这个函数也可以接受中间的名字。让我们修改get_formatted_name(),将中间名设置为optional,然后再次运行这个测试用例。如果通过,我们将确认这个函数可以正确地处理中间名。要使中间名可选,可以在函数定义中将参数middle移到参数列表的末尾,并将其默认值指定为空字符串。我们还将添加一个if测试,根据是否提供中间名来创建名称。例子如下:
执行结果:
(5)添加新的测试。
在确定GET _ FORMATED _ NAME()可以正确处理简单名称后,我们将编写另一个测试来测试包含中间名的名称。为此,我们向NamesTestCase类添加了另一个方法。例子如下:
执行结果:1.2 测试类
在前半部分,您编写了一个针对单个函数的测试。接下来,您为一个类编写了一个测试。许多程序中都使用了类,所以证明你的类工作正常会很有帮助。如果对该类的测试通过了,您可以确信对该类的改进没有意外地破坏其原始行为。
(一)各种断言方法
Python unittest中提供了许多断言方法。测试用例类。如前所述,断言方法检查您认为应该满足的条件是否实际满足。如果这个条件真的满足了,你关于程序行为的假设就被证实了,你就可以确定这里面没有错误。如果你认为应该满足的条件实际上没有满足,Python会抛出异常。下表描述了六种常用的断言方法。使用这些方法来验证返回值是否等于预期值,返回值是否为True或False,以及返回值是否在列表中。您只能在继承unittest的类中使用这些方法。TestCase让我们看看在测试类时如何使用其中一个。
(B)要测试的类别
类的测试类似于函数的测试。——你的大部分工作是测试类中方法的行为,但也有一些不同。让我们写一个类来测试。看一个帮助管理匿名调查的类。例子如下:
该类首先存储您指定的调查问题,并创建一个空列表来存储答案。此类包含打印调查问题、向答案列表添加新答案以及打印列表中存储的所有答案的方法。要创建这个类的实例,只需提供一个问题。一旦有了调查实例,就可以使用show_question()来显示问题,使用store_response()来存储答案,使用show_results()来显示调查结果。为了证明AnonymousSurvey类可以正确工作,让我们编写一个使用它的程序:
执行结果:
(3)测试匿名调查类
让我们编写一个测试来验证AnonymousSurvey类行为的一个方面:如果用户只为调查问题提供一个答案,答案也可以被正确存储。为此,在存储答案后,我们将使用assertIn()方法来验证它是否包含在答案列表中:
首先,我们导入了要测试的模块unittest和类AnonymousSurvey。我们将测试用例命名为TestAnonymousSurvey,它也继承了unittest。TestCase第一个测试方法验证一个调查问题的单个答案在存储后将包含在调查结果列表中。这个方法的一个很好的描述性名称是test_store_single_response()。如果这个测试失败了,我们可以从输出中的方法名得知在存储单个调查答案时出现了问题。要测试一个类的行为,您需要创建它的一个实例。我们用这个问题“你最先学会说什么语言?”创建一个名为my_survey的实例,然后使用store_response()方法存储一个英语答案。接下来,我们检查英语是否包含在列表my_survey.responses中,以验证该答案是否被正确存储。当我们运行test_survey.py时,测试通过:
只能收集一个答案的调查用处不大。让我们验证当用户提供三个答案时,它们也将被正确存储。为此,我们向TestAnonymousSurvey添加了另一个方法:
执行结果:
(4)方法设置()
在前面的test_survey.py中,我们在每个测试方法中创建了一个AnonymousSurvey实例,并在每个方法中创建了一个答案。单元测试。TestCase类包含方法setUp()。让我们只创建这些对象一次,并在每个测试方法中使用它们。如果在TestCase类中包含方法setUp(),Python将首先运行它,然后运行每个以test_开头的方法。这样,在方法setUp()中创建的对象可以在您编写的每个测试方法中使用。下面使用setUp()为方法test_store_single_response()和test _ store _ three _ responses()创建一个调查对象和一组答案。例子如下:
执行结果:
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。