在本章中,我们将学习线程应用程序的测试.我们还将了解测试的重要性.
在我们深入讨论测试的重要性之前,我们需要知道什么是测试.一般而言,测试是一种了解某些东西是如何运作的技术.另一方面,特别是如果我们谈论计算机程序或软件,那么测试就是访问软件程序功能的技术.
在本节中,我们将讨论软件的重要性测试.在软件开发中,必须在向客户端发布软件之前进行双重检查.这就是经验丰富的测试团队测试软件非常重要的原因.请考虑以下几点,以了解软件测试的重要性 :
当然,没有公司希望提供低质量的软件和没有客户想购买低质量的软件.测试通过查找和修复其中的错误来提高软件质量.
任何业务中最重要的部分是满意度他们的客户通过提供无错误和优质软件,公司可以实现客户满意度.
假设我们已经制作了软件10000行的系统,我们需要添加一个新功能,然后开发团队会关注这个新功能对整个软件的影响.在这里,测试起着至关重要的作用,因为如果测试团队已经完成了一系列测试,那么它可以避免任何潜在的灾难性休息.
任何企业的另一个最重要的部分是该产品用户的体验.只有测试才能确保最终用户发现产品简单易用.
测试可以减少总量通过在开发的测试阶段找到并修复错误而不是在交付后修复它来获得软件成本.如果软件交付后出现重大错误,那么就客户不满意,公司负面声誉等方面的费用和无形成本而言会增加其实际成本.
始终建议您对要测试的内容有适当的了解.在本节中,我们将首先了解测试任何软件时测试人员的主要动机.应该避免代码覆盖,即我们的测试套件在测试时遇到的代码行数.这是因为,在测试时,只关注代码行数对我们的系统没有任何实际价值.可能会有一些错误,即使在部署之后也会在稍后的阶段反映出来.
考虑以下与测试和减去相关的重要事项;
我们需要专注于测试代码的功能而不是代码覆盖率.
我们需要首先测试代码中最重要的部分,然后转向代码中不太重要的部分.它肯定会节省时间.
测试人员必须拥有多种不同的测试,可以将软件推向极限.
由于能够利用多核架构的真正能力,并发软件系统是替换顺序系统.最近,并发系统程序被用于从手机到洗衣机,从汽车到飞机等各种各样的系统程序.我们需要更加小心地测试并发软件程序,因为如果我们已经为单线程应用程序添加了多个线程已经是一个错误,那么我们最终会遇到多个错误.
并发软件程序的测试技术广泛关注于选择交错,暴露可能有害的模式,如竞争条件,死锁和违反原子性.以下是测试并发软件程序的两种方法 :
这种方法旨在尽可能广泛地探索交错的空间.这种方法可以采用蛮力技术,其他方法采用偏序降阶技术或启发式技术来探索交错空间.
属性驱动的方法依赖于观察到并发错误更可能发生在暴露特定属性(例如可疑内存访问模式)的交错下.不同的属性驱动方法针对不同的错误,如竞争条件,死锁和违反原子性,这进一步取决于一个或其他特定属性.
测试策略也称为测试方法.该战略定义了如何进行测试.测试方法有两种技术 :
一种方法,尽早启动测试设计过程,以便找到并修复创建构建之前的缺陷.
在开发过程完成之前测试不会开始的方法.
在对python程序应用任何测试策略或方法之前,我们必须对软件程序可能具有的错误类型有一个基本的了解.错误如下 :
在程序开发过程中,可能会出现许多小错误.错误主要是由于输入错误造成的.例如,缺少冒号或关键字的拼写错误等.此类错误是由于程序语法错误而非逻辑错误造成的.因此,这些错误称为语法错误.
语义错误也称为逻辑错误.如果软件程序中存在逻辑或语义错误,则语句将编译并正确运行,但由于逻辑不正确,它将无法提供所需的输出.
这是测试python程序最常用的测试策略之一.此策略用于测试代码的单元或组件.按单位或组件,我们指的是代码的类或函数.单元测试通过测试"小"单元简化了大型编程系统的测试.在上述概念的帮助下,单元测试可以定义为一种方法,其中测试单个源代码单元以确定它们是否返回所需的输出.
在随后的章节中,我们将学习用于单元测试的不同Python模块.
单元测试的第一个模块是unittest模块.它受JUnit的启发,默认包含在Python3.6中.它支持测试自动化,共享测试的设置和关闭代码,将测试集合到集合中,以及测试与报告框架的独立性.
以下是一些支持的重要概念unittest模块
它用于设置测试,以便在开始测试之前运行并在完成之后拆除测试.它可能涉及在开始测试之前创建临时数据库,目录等.
测试用例检查是否需要响应是否来自特定的输入集. unittest模块包含一个名为TestCase的基类,可用于创建新的测试用例.它包括两个默认方法 :
setUp() : 一种用于在锻炼之前设置测试夹具的钩子方法.在调用已实现的测试方法之前调用它.
tearDown( : 一个钩子方法,用于在运行所有后解构类夹具)在课堂上进行测试.
这是测试套件的集合,测试案例或两者.
它控制测试用例或套装的运行并向用户提供结果.它可能使用GUI或提供结果的简单文本界面.
示例
以下Python程序使用unittest模块测试a名为 Fibonacci 的模块.该程序有助于计算一个数字的Fibonacci系列.在这个例子中,我们创建了一个名为Fibo_test的类,通过使用不同的方法来定义测试用例.这些方法继承自unittest.TestCase.我们使用两个默认方法--setUp()和tearDown().我们还定义了testfibocal方法.必须启动测试的名称用字母测试.在最后一个块中,unittest.main()为测试脚本提供了一个命令行界面.
import unittest def fibonacci(n): a, b = 0, 1 for i in range(n): a, b = b, a + b return a class Fibo_Test(unittest.TestCase): def setUp(self): print("This is run before our tests would be executed") def tearDown(self): print("This is run after the completion of execution of our tests") def testfibocal(self): self.assertEqual(fib(0), 0) self.assertEqual(fib(1), 1) self.assertEqual(fib(5), 5) self.assertEqual(fib(10), 55) self.assertEqual(fib(20), 6765) if __name__ == "__main__": unittest.main()
从命令行,上面的脚本产生一个看起来像这个 : 去的输出;
This runs before our tests would be executed. This runs after the completion of execution of our tests. . ---------------------------------------------------------------------- Ran 1 test in 0.006s OK
现在,为了更清楚,我们正在更改我们的代码,这有助于定义Fibonacci模块.
考虑以下代码块作为示例 :
def fibonacci(n): a, b = 0, 1 for i in range(n): a, b = b, a + b return a
对代码块进行一些更改,如下所示 :
def fibonacci(n): a, b = 1, 1 for i in range(n): a, b = b, a + b return a
现在,在使用更改后的代码运行脚本后,我们将获得以下输出和减号;
This runs before our tests would be executed. This runs after the completion of execution of our tests. F ====================================================================== FAIL: testCalculation (__main__.Fibo_Test) ---------------------------------------------------------------------- Traceback (most recent call last): File "unitg.py", line 15, in testCalculation self.assertEqual(fib(0), 0) AssertionError: 1 != 0 ---------------------------------------------------------------------- Ran 1 test in 0.007s FAILED (failures = 1)
上述输出显示模块未能提供所需的输出./p>
docktest模块还有助于单元测试.它还预先包装了python.它比unittest模块更容易使用. unittest模块更适合复杂的测试.要使用doctest模块,我们需要导入它.相应函数的docstring必须具有交互式python会话及其输出.
如果我们的代码中一切正常,那么docktest模块就没有输出;否则,它将提供输出.
以下Python示例使用docktest模块测试名为Fibonacci的模块,这有助于计算Fibonacci系列的数字.
import doctest def fibonacci(n): """ Calculates the Fibonacci number >>> fibonacci(0) 0 >>> fibonacci(1) 1 >>> fibonacci(10) 55 >>> fibonacci(20) 6765 >>> """ a, b = 1, 1 for i in range(n): a, b = b, a + b return a if __name__ == "__main__": doctest.testmod()
我们可以看到名为fib的相应函数的docstring具有交互式python会议以及产出.如果我们的代码没问题,那么doctest模块就没有输出.但要了解它是如何工作的,我们可以使用-v选项运行它.
(base) D:\ProgramData>python dock_test.py -v Trying: fibonacci(0) Expecting: 0 ok Trying: fibonacci(1) Expecting: 1 ok Trying: fibonacci(10) Expecting: 55 ok Trying: fibonacci(20) Expecting: 6765 ok 1 items had no tests: __main__ 1 items passed all tests: 4 tests in __main__.fibonacci 4 tests in 2 items. 4 passed and 0 failed. Test passed.
现在,我们将更改有助于定义Fibonacci模块的代码
将以下代码块视为示例 :
def fibonacci(n): a, b = 0, 1 for i in range(n): a, b = b, a + b return a
以下代码块有助于更改 :
def fibonacci(n): a, b = 1, 1 for i in range(n): a, b = b, a + b return a
在没有-v选项的情况下运行脚本后,使用更改后的代码,我们将得到如下所示的输出.
(base) D:\ProgramData>python dock_test.py ********************************************************************** File "unitg.py", line 6, in __main__.fibonacci Failed example: fibonacci(0) Expected: 0 Got: 1 ********************************************************************** File "unitg.py", line 10, in __main__.fibonacci Failed example: fibonacci(10) Expected: 55 Got: 89 ********************************************************************** File "unitg.py", line 12, in __main__.fibonacci Failed example: fibonacci(20) Expected: 6765 Got: 10946 ********************************************************************** 1 items had failures: 3 of 4 in __main__.fibonacci ***Test Failed*** 3 failures.
我们可以在上面的输出中看到三个测试都失败了.