Python基础教程(第3版)中文版 第16章 测试基础(笔记)

简介: Python基础教程(第3版)中文版 第16章 测试基础(笔记)

                                         第16章 测试基础

1.先测试再编码

为程序的各个部分编写测试很重要(单元测试)。

“测试一点点,编写一点点”。

1.准确的需求说明

有爱阐述程序的目标,可编写需求说明。

2.做好应对变化的准备

3.测试四步曲

1.确定要实现的功能,记录下来,为之编写测试

2.编写实现功能的框架代码,让程序能够运行,但测试仍无法通过,确保代码不正确时,测试能够报错。

3.编写让测试能通过的代码,无需实现全部,只要能通过测试即可。

4.改进(重构)代码以全面而准确地实现所需的功能,同时确保测试能通过。

2.测试工具

有2个模块可帮助自动完成测试过程。

unittest:通用的测试框架
doctest:为检查文档设计的,也可用来单元测试

1.doctest

实例:

def square(x):

   '''

   计算平方并返回结果

   >>> square(2)

   4

   >>> square(3)

   9

   '''

   return x ** x


if __name__ == '__main__':

   import doctest, my_math

   doctest.testmod(my_math)

保存为my_math.py

然后在命令行运行 python my_math.py

什么都不会输出。

使用 python my_math.py -v

输出详细信息

2.unittest

实例:

#使用unittest测试 my_math

import unittest, my_math


class ProductTestCase(unittest.TestCase):


   def test_integers(self):

       for x in range(-10, 10):

           for y in range(-10, 10):

               p = my_math.product(x, y)

               self.assertEqual(p, x * y, 'Integer multiplication failed')


   def test_float(self):

       for x in range(-10, 10):

           for y in range(-10, 10):

               x = x / 10

               y = y / 10

               p = my_math.product(x, y)

               self.assertEqual(p, x * y, 'Float multiplication failed')


if __name__ == '__main__': unittest.main()


#被测试的my_math 模块

def product(x, y):

   #这句是故意出错来看看测试是不是有用

   if x == 7 and y == 9:

       return 'An insidious bug has surfaced!'

   return x * y  

3. 超越单元测试

1.使用PyChecker和PyLint检查源代码

PyChecker是检查python源代码的工具,

PyLint支持PyChecker的大部分功能,还有其他功能,如变量名是否规范。。。


由于PyChecker有很多年没有更新了,所以就使用PyLint

直接使用 pip install pylint 安装


使用PyLint 检查文件时,将模块(或包)名作为参数:

pylint module


实例:

#使用模块subprocess调用外部检查器

import unittest, my_math

from subprocess import Popen, PIPE


class ProductTestCase(unittest.TestCase):

   #测试.

   def test_integers(self):

       for x in range(-10, 10):

           for y in range(-10, 10):

               p = my_math.product(x, y)

               self.assertEqual(p, x * y, 'Integer multiplication failed')


   def test_float(self):

       for x in range(-10, 10):

           for y in range(-10, 10):

               x = x / 10

               y = y / 10

               p = my_math.product(x, y)

               self.assertEqual(p, x * y, 'Float multiplication failed')

 

   def test_with_PyLint(self):

       cmd = 'pylint', '-rn', 'my_math'

       pylint = Popen(cmd,stdout=PIPE, stderr=PIPE)

       self.assertEqual(pylint.stdout.read(), '')


if __name__ == '__main__': unittest.main()

#不知道为什么用不了这个方法,所以就直接在命令行用pylint module 了



2.性能分析

通常不需要过分追求速度。但是速度很慢时,就必须优化。性能分析帮助找到运行慢的地方。

标准库模块profile(C语言版本cProfile)

使用时只需调用其方法run并提供一个字符串参数。

>>> import cProfile

>>> from my_math import product

>>> cProfile.run('product(1, 2)')

将输出函数调用次数和花费时间

如果向run提供第二个参数('my_math.profile')将分析结果保存到这个文件中,然后就可以使用模块psats分析结果


相关文章
|
7天前
|
数据采集 存储 JSON
Python 数据抓取教程:完结篇
Python 数据抓取教程:完结篇
20 1
|
10天前
|
测试技术 Python
|
7天前
|
Java 测试技术 开发者
Python:使用标准库编写单元测试
在现代软件开发中,编写单元测试是确保代码质量和可靠性的重要步骤。Python 提供了一个内置的单元测试框架,称为 unittest,它可以帮助开发者方便地编写和运行测试。本文将详细介绍如何使用 unittest 编写单元测试。
|
9天前
|
达摩院 语音技术 异构计算
语音识别-免费开源的语音转文本软件Whisper的本地搭建详细教程,python版本是3.805,ffmpeg是专门处理音视频的,ffmpeg的下载链接,现在要求安装python和ffmpeg
语音识别-免费开源的语音转文本软件Whisper的本地搭建详细教程,python版本是3.805,ffmpeg是专门处理音视频的,ffmpeg的下载链接,现在要求安装python和ffmpeg
|
11天前
|
测试技术 API 持续交付
【Python自动化测试】文章探讨了Python在测试领域的关键作用,分为三部分
【7月更文挑战第2天】【Python自动化测试】文章探讨了Python在测试领域的关键作用,分为三部分:1) 自动化测试的重要性与Python的易用性、库支持、跨平台和社区优势;2) Unittest作为标准测试框架的基础用法,及Pytest的灵活性与强大功能;3) 实践中包括Selenium的Web UI测试、Requests的API测试,强调测试隔离、持续集成等最佳实践。Python助力高效稳定的软件测试。
24 2
|
11天前
|
机器学习/深度学习 自然语言处理 TensorFlow
使用Python实现深度学习模型:序列建模与生成模型的博客教程
【7月更文挑战第2天】 使用Python实现深度学习模型:序列建模与生成模型的博客教程
16 1
|
12天前
|
机器学习/深度学习 数据采集 算法
Scikit-Learn基础教程
Scikit-Learn基础教程
17 2
|
9天前
|
Python
Python 中 decimal 模块的用法教程
Python 中 decimal 模块的用法教程
9 0
|
10天前
|
机器学习/深度学习 TensorFlow 算法框架/工具
使用Python实现深度学习模型:迁移学习与领域自适应教程
【7月更文挑战第3天】 使用Python实现深度学习模型:迁移学习与领域自适应教程
11 0
|
12天前
|
JSON JavaScript 测试技术
Postman接口测试工具详解
Postman接口测试工具详解
23 1