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

这篇文章主要介绍了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.

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

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

(0)

相关推荐

  • 详解Python多线程Selenium跨浏览器测试

    前言 在web测试中,不可避免的一个测试就是浏览器兼容性测试,在没有自动化测试前,我们总是苦逼的在一台或多台机器上安装N种浏览器,然后手工在不同的浏览器上验证主业务流程和关键功能模块功能,以检测不同浏览器或不同版本浏览器上,我们的web应用是否可以正常工作. 下面我们看看怎么利用python selenium进行自动化的跨浏览器测试. 什么是跨浏览器测试 跨浏览器测试是功能测试的一个分支,用以验证web应用能在不同的浏览器上正常工作. 为什么需要跨浏览器测试 通常情况下,我们都期望web类应用

  • python 多线程对post请求服务器测试并发的方法

    如下所示: # -*- coding: utf-8 -*- import requests import threading import time class postrequests(): def __init__(self): self.url = '请求网址' self.files = { 'unknown_image':open('刘诗诗.jpg','rb') } def post(self): try: r = requests.post(self.url,files=self.fi

  • Python多线程应用于自动化测试操作示例

    本文实例讲述了Python多线程应用于自动化测试操作.分享给大家供大家参考,具体如下: 多线程执行测试用例 实例: import threading from time import sleep,ctime from selenium import webdriver #测试用例1 def test_baidu(browser,search): print("开始,现在时间是%s"%ctime()) print("浏览器是%s"%browser) if browse

  • Python实现的多线程http压力测试代码

    本文实例讲述了Python实现的多线程http压力测试代码.分享给大家供大家参考,具体如下: # Python version 3.3 __author__ = 'Toil' import sys, getopt import threading def httpGet(url, file): import http.client conn = http.client.HTTPConnection(url) conn.request("GET", file) r = conn.getr

  • python编程测试电脑开启最大线程数实例代码

    本文实例代码主要实现python编程测试电脑开启最大线程数,具体实现代码如下. #!/usr/bin/env python #coding=gbk import threading import time, random, sys class Counter: def __init__(self): self.lock = threading.Lock() self.value = 0 def increment(self): self.lock.acquire() self.value = v

  • 如何使用Python多线程测试并发漏洞

    这篇文章主要介绍了如何使用Python多线程测试并发漏洞,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 需求介绍 有时候想看看Web应用在代码或者数据库层有没有加锁,比如在一些支付.兑换类的场景,通过多线程并发访问的测试方式可以得到一个结论. 步骤 1. Burp Suite安装插件 安装一个Copy As Python-Requests插件,提高编码效率: 2. 拦截包并拷贝发包的代码 打开一个文本编辑器,右键粘贴出来: import req

  • python多线程http压力测试脚本

    本文实例为大家分享了python多线程http压力测试的具体代码,供大家参考,具体内容如下 #coding=utf-8 import sys import time import thread import httplib, urllib import random import uuid import logging logging.basicConfig(level=logging.DEBUG, format='%(asctime)s %(filename)s[line:%(lineno)d

  • python多线程并发及测试框架案例

    这篇文章主要介绍了python多线程并发及测试框架案例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.循环创建多个线程,并通过循环启动执行 import threading from datetime import * from time import sleep # 单线程执行 def test(): print('hello world') t = threading.Thread(target=test) t.start() # 多线

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

    这篇文章主要介绍了Python测试线程应用程序过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 在本章中,我们将学习线程应用程序的测试.我们还将了解测试的重要性. 为什么要测试? 在我们深入讨论测试的重要性之前,我们需要知道测试的内容.一般来说,测试是一种了解某些东西是如何运作的技术.另一方面,特别是如果我们谈论计算机程序或软件,那么测试就是访问软件程序功能的技术. 在本节中,我们将讨论软件测试的重要性.在软件开发中,必须在向客户端发布软

  • python使用rsa非对称加密过程解析

    这篇文章主要介绍了python使用rsa非对称加密过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.安装rsa 支持python 2.7 或者 python 3.5 以上版本 使用豆瓣pypi源来安装rsa pip install -i https://pypi.douban.com/simple rsa 2.加密解密 2.1.生成公私钥对 import rsa # 1.接收者(A)生成512位公私钥对 # a. lemon_pub为

  • python打包成so文件过程解析

    这篇文章主要介绍了python打包成so文件过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 wget https://bootstrap.pypa.io/get-pip.py python get-pip.py pip install cython 编写setput.py文件: setup.py文件内容如下: from distutils.core import setup from distutils.extension import

  • python文字转语音实现过程解析

    这篇文章主要介绍了python文字转语音实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 使用百度接口 接口地址 https://ai.baidu.com/docs#/TTS-Online-Python-SDK/top 安装接口 pip install baidu-aip from aip import AipSpeech """ 你的 APPID AK SK """ APP_ID =

  • python全局变量引用与修改过程解析

    这篇文章主要介绍了python全局变量引用与修改过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一.引用 使用到的全局变量只是作为引用,不在函数中修改它的值的话,不需要加global关键字.如: #! /usr/bin/python a = 1 b = [2, 3] def func(): if a == 1: print("a: %d" %a) for i in range(4): if i in b: print(&quo

  • Python namedtuple命名元组实现过程解析

    这篇文章主要介绍了Python namedtuple命名元组实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 命名元组(namedtuple)是一种带有属性的元组,它们是组合只读数据的很好的方式. 相比一般的元组,构造命名元组需要先导入namedtuple,因为它不在默认的命名空间里.然后通过名字和属性来定义一个命名元组.这会返回一个像类一样的对象,可以进行多次实例化. 命名元组可以被打包.解包以及做所有可以对普通元组做的事,并且还可

  • python自动化unittest yaml使用过程解析

    这篇文章主要介绍了python自动化unittest yaml使用过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 在编写unittest自动化用例时,一个请求需要编写多条用例,而涉及的参数基本相同,这时候就会用到配置文件,可以把参数配置项统一管理,避免重复代码,也方便后期维护 此处用到的是yaml,首先需要安装yaml库,pip install yaml 安装成功后,脚本导入语句,import yaml,具体语法可参照如上入门教程 举例

  • Python Decorator的设计模式演绎过程解析

    目录 关于代理模式.装饰模式 Python中的代理/装饰 还有什么不理想的地方呢? 补充 关于代理模式.装饰模式 设计模式中经常提到的代理模式.装饰模式,这两种叫法实际上是说的同一件事,只是侧重点有所不同而已. 这两者都是通过在原有对象的基础上封装一层对象,通过调用封装后的对象而不是原来的对象来实现代理/装饰的目的. 例如:(以Java为例) public class CountProxy implements Count { private CountImpl countImpl; publi

  • Python Django源码运行过程解析

    目录 一.Django运行顺序 1.启动 1.1 命令行启动(测试服务器) 2.监听 2.1 runserver(测试服务器) 3.中间件的执行 本文只算是本人片面之言(当然也会借鉴网络上公开资料),而且技术含量比较低,内容质量也一般,大家仅限参考即可 如果对本文看不太懂,请先阅读后面文章,等都差不多看完再回顾来看 一.Django运行顺序 WSGI会不断监听客户端发送来的请求 先经过中间件进行分析验证处理 然后经过url分发与验证 视图层进行处理 再经过中间件进行分析验证处理 返回响应内容 1

  • Python使用APScheduler实现定时任务过程解析

    前言 APScheduler是基于Quartz的一个Python定时任务框架.提供了基于日期.固定时间间隔以及crontab类型的任务,并且可以持久化任务. 在线文档:https://apscheduler.readthedocs.io/en/latest/userguide.html 一.安装APScheduler pip install apscheduler 二.基本概念 APScheduler有四大组件: 1.触发器 triggers : 触发器包含调度逻辑.每个作业都有自己的触发器,用

随机推荐