Python测试线程应用程序过程解析


Posted in Python onDecember 31, 2019

这篇文章主要介绍了Python测试线程应用程序过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

在本章中,我们将学习线程应用程序的测试。我们还将了解测试的重要性。

为什么要测试?

在我们深入讨论测试的重要性之前,我们需要知道测试的内容。一般来说,测试是一种了解某些东西是如何运作的技术。另一方面,特别是如果我们谈论计算机程序或软件,那么测试就是访问软件程序功能的技术。

在本节中,我们将讨论软件测试的重要性。在软件开发中,必须在向客户端发布软件之前进行双重检查。这就是由经验丰富的测试团队测试软件非常重要的原因。请考虑以下几点来理解软件测试的重要性

提高软件质量

当然,没有公司想要提供低质量的软件,也没有客户想购买低质量的软件。测试通过查找和修复其中的错误来提高软件的质量。

客户满意度

任何业务中最重要的部分是客户的满意度。通过提供无错误和优质软件,公司可以实现客户满意度。

减轻新功能的影响

假设我们已经建立了一个10000行的软件系统,我们需要添加一个新功能,然后开发团队就会担心这个新功能对整个软件的影响。此外,测试也起着至关重要的作用,因为如果测试团队已经完成了一系列测试,那么它可以使我们免于任何潜在的灾难性中断。

用户体验

任何业务中另一个最重要的部分是该产品用户的体验。只有测试可以确保最终用户发现它简单易用。

减少开支

测试可以通过在开发的测试阶段找到并修复错误而不是在交付后修复它来降低软件的总成本。如果在交付软件后出现重大错误,那么就客户不满意,公司负面声誉等方面的费用和无形成本而言,会增加其实际成本。

测试什么?

始终建议您对要测试的内容有适当的了解。在本节中,我们将首先了解测试任何软件时测试人员的主要动机。代码覆盖率,即我们的测试套件在测试时会遇到多少行代码,应该避免。这是因为,在测试时,仅关注代码行数对我们的系统没有任何实际价值。可能仍然存在一些错误,即使在部署之后,这些错误也会在稍后阶段反映出来。

考虑以下与测试内容相关的重要观点

我们需要专注于测试代码的功能而不是代码覆盖率。

我们需要首先测试代码中最重要的部分,然后转向代码中不太重要的部分。这肯定会节省时间。

测试人员必须具有多种不同的测试,可以将软件推向极限。

测试并发软件程序的方法

由于能够利用多核架构的真正能力,并发软件系统正在取代顺序系统。最近,并发系统程序被用于从手机到洗衣机,从汽车到飞机等各种各样的系统程序。我们需要更加谨慎地测试并发软件程序,因为如果我们已经为单线程应用程序添加了多个线程已经是一个错误,那么我们最终会遇到多个错误。

并发软件程序的测试技术广泛关注于选择交错,这种交错暴露了可能有害的模式,如竞争条件,死锁和违反原子性。以下是测试并发软件程序的两种方法

系统探索

该方法旨在尽可能广泛地探索交错的空间。这种方法可以采用蛮力技术,其他方法采用偏序降阶技术或启发式技术来探索交织空间。

房产驱动

属性驱动的方法依赖于观察到并发错误更可能发生在暴露特定属性(例如可疑内存访问模式)的交错下。不同的属性驱动方法针对不同的错误,如竞争条件,死锁和违反原子性,这进一步取决于一个或其他特定属性。

测试策略

测试策略也称为测试方法。该策略定义了如何进行测试。测试方法有两种技术 -

主动

一种方法,尽可能早地启动测试设计过程,以便在创建构建之前找到并修复缺陷。

反应

一种方法,在开发过程完成之前,测试不会开始。

在对python程序应用任何测试策略或方法之前,我们必须对软件程序可能具有的错误类型有一个基本的想法。错误如下

语法错误

在程序开发期间,可能会出现许多小错误。错误主要是由于输入错误。例如,缺少冒号或关键字的拼写错误等。此类错误是由于程序语法错误而非逻辑错误造成的。因此,这些错误称为语法错误。

语义错误

语义错误也称为逻辑错误。如果软件程序中存在逻辑或语义错误,则语句将正确编译并运行,但由于逻辑不正确,因此无法提供所需的输出。

单元测试

这是测试python程序最常用的测试策略之一。此策略用于测试代码的单元或组件。按单位或组件,我们指的是代码的类或函数。单元测试通过测试“小”单元简化了大型编程系统的测试。借助于上述概念,单元测试可以被定义为一种方法,其中测试各个源代码单元以确定它们是否返回所需的输出。

在随后的章节中,我们将了解用于单元测试的不同Python模块。

unittest模块

单元测试的第一个模块是unittest模块。它受JUnit的启发,默认情况下包含在Python3.6中。它支持测试自动化,共享测试的设置和关闭代码,将测试聚合到集合中,以及测试与报告框架的独立性。

以下是unittest模块支持的一些重要概念

文字夹具

它用于设置测试,以便在开始测试之前运行并在测试结束后拆除。它可能涉及在开始测试之前创建临时数据库,目录等。

测试用例

测试用例检查所需的响应是否来自特定的输入集。unittest模块包含一个名为TestCase的基类,可用于创建新的测试用例。它包含两个默认方法 -

setUp() - 一种用于在运行之前设置测试夹具的钩子方法。 在调用实现的测试方法之前调用它。

tearDown( - 用于在类中运行所有测试后解构类夹具的钩子方法。

测试套件

它是测试套件,测试用例或两者的集合。

试验跑步者

它控制测试用例或套装的运行,并为用户提供结果。它可以使用GUI或简单的文本界面来提供结果。

以下Python程序使用unittest模块来测试名为 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)

上面的输出显示模块未能提供所需的输出。

Docktest模块
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.

我们可以在上面的输出中看到三个测试都失败了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python中asyncore异步模块的用法及实现httpclient的实例
Jun 28 Python
Python从零开始创建区块链
Mar 06 Python
python基于itchat模块实现微信防撤回
Apr 29 Python
pandas DataFrame 行列索引及值的获取的方法
Jul 02 Python
pandas基于时间序列的固定时间间隔求均值的方法
Jul 04 Python
PyQt5使用QTimer实现电子时钟
Jul 29 Python
Python列表原理与用法详解【创建、元素增加、删除、访问、计数、切片、遍历等】
Oct 30 Python
Python操作redis和mongoDB的方法
Dec 19 Python
python实现局域网内实时通信代码
Dec 22 Python
Python pandas对excel的操作实现示例
Jul 21 Python
Django中的JWT身份验证的实现
May 07 Python
Python实现科学占卜 让视频自动打码
Apr 09 Python
Python TCPServer 多线程多客户端通信的实现
Dec 31 #Python
python给指定csv表格中的联系人群发邮件(带附件的邮件)
Dec 31 #Python
Python面向对象封装操作案例详解
Dec 31 #Python
Python实现隐马尔可夫模型的前向后向算法的示例代码
Dec 31 #Python
Python面向对象之私有属性和私有方法应用案例分析
Dec 31 #Python
Pycharm最新激活码2019(推荐)
Dec 31 #Python
python ftplib模块使用代码实例
Dec 31 #Python
You might like
PHP新特性之字节码缓存和内置服务器
2017/08/11 PHP
PHP封装的XML简单操作类完整实例
2017/11/13 PHP
WordPress 照片lightbox效果的运用几点
2009/06/22 Javascript
jQuery html()等方法介绍
2009/11/18 Javascript
jquery dialog键盘事件代码
2010/08/01 Javascript
jquery之empty()与remove()区别说明
2010/09/10 Javascript
javascript变量作用域使用中常见错误总结
2013/03/26 Javascript
jquery 面包屑导航 具体实现
2013/06/05 Javascript
javascript 获取HTML DOM父、子、临近节点
2014/06/16 Javascript
理解javascript回调函数
2014/12/28 Javascript
使用 TypeScript 重新编写的 JavaScript 坦克大战游戏代码
2015/04/07 Javascript
20分钟打造属于你的Bootstrap站点
2016/07/27 Javascript
动态生成的DOM不会触发onclick事件的原因及解决方法
2016/08/06 Javascript
js入门之Function函数的使用方法【新手必看】
2016/11/22 Javascript
原生ajax处理json格式数据的实例代码
2016/12/25 Javascript
bootstrap 下拉多选框进行多选传值问题代码分析
2017/02/14 Javascript
vuejs2.0实现一个简单的分页示例
2017/02/22 Javascript
详解微信小程序审核不通过的解决方法
2018/01/17 Javascript
React 组件中的 bind(this)示例代码
2018/09/16 Javascript
解决angularjs service中依赖注入$scope报错的问题
2018/10/02 Javascript
[01:46]新英雄登场
2019/09/10 DOTA
Python实现pdf文档转txt的方法示例
2018/01/19 Python
Python实现将doc转化pdf格式文档的方法
2018/01/19 Python
使用Python读取大文件的方法
2018/02/11 Python
python实现下载pop3邮件保存到本地
2018/06/19 Python
django多文件上传,form提交,多对多外键保存的实例
2019/08/06 Python
django的autoreload机制实现
2020/06/03 Python
Python魔术方法专题
2020/06/19 Python
python程序如何进行保存
2020/07/03 Python
python实现画图工具
2020/08/27 Python
家长给老师的道歉信
2014/01/13 职场文书
乡镇庆八一活动方案
2014/02/02 职场文书
办理信用卡工作证明
2014/09/30 职场文书
重阳节简报
2015/07/20 职场文书
2020年个人安全保证书参考模板
2020/01/08 职场文书
Elasticsearch 批量操作
2022/04/19 Python