测试Python代码

作为程序员,懂得测试,这是必须的职业技能。很遗憾,我以前从未意识到这点,因此经历了很多叫苦不迭的开发生涯。当然了,期望每个人都成为测试高手也是不可能的,但是最基本的单元测试啥的是不惜的,尤其是现在中小公司测试开发不分家的情况下,懂得测试简直是优秀程序员的标志啊。这篇博客就介绍一下Python的测试方法,主要是单元测试。

mock

在介绍具体的测试方法之前,先介绍一下mock,简单来说,mock的作用就是要达到一种挂羊头卖狗肉的效果。例如,你想测试一个web客户端,如果为了测试去搭建一个真实的web服务器,这个代价就太大了。这时候,我们就可以创建一个mock对象,通过一些接口模拟一个web服务器,从而简化了测试的难度,而且这样一个mock对象,可控性很好,模拟延时、断线等都非常简单,而如果是真实的服务器程序就要麻烦的多了。

Tim Mackinnon总结了一些需要使用mock对象的情况:

1、真实对象具有不可确定的行为(产生不可预测的结果,如股票的行情)

2、真实对象很难被创建(比如具体的web容器)

3、真实对象的某些行为很难触发(比如网络错误)

4、真实情况令程序的运行速度很慢

5、真实对象有用户界面

6、测试需要询问真实对象它是如何被调用的(比如测试可能需要验证某个回调函数是否被调用了)

7、真实对象实际上并不存在(当需要和其他开发小组,或者新的硬件系统打交道的时候,这是一个普遍的问题)

Python中的mock模块就是这个作用,使用pip install mock就可以安装,在3.3之后,这个模块归入了后边要讲的unittest模块,也成了标准库的一部分了。

下面的内容基本都是mock文档中的东西,简单翻译一下放在这里。

Mock和 MagicMock是mock模块中核心的两个类,当你访问这些类的实例对象的某个属性时,这些对象会为你创建这些属性(如果不存在)并且会记录下你使用这些属性的方式。你可以指定这些对象被调用时的返回值或者可用的属性,然后使用断言对结果进行验证。你也可以使用side_effect来抛出异常或者是mock对象被调用时返回不同的值。

>>> from mock import MagicMock
>>> thing = ProductionClass()
# 设定返回值为3 >>> thing.method = MagicMock(return_value=3) >>> thing.method(3, 4, 5, key='value') # 注意调用参数
# 可以使用断言判断返回值是否为3 3 >>> thing.method.assert_called_with(3, 4, 5, key='value') #验证调用参数是否正确 >>> mock = Mock(side_effect=KeyError('foo')) >>> mock() Traceback (most recent call last): ... KeyError: 'foo' >>> values = {'a': 1, 'b': 2, 'c': 3} >>> def side_effect(arg): ... return values[arg] ... >>> mock.side_effect = side_effect >>> mock('a'), mock('b'), mock('c') (1, 2, 3) >>> mock.side_effect = [5, 4, 3, 2, 1] >>> mock(), mock(), mock() (5, 4, 3)

  使用patch装饰器可以很容易的模拟一个类或者其对象。

>>> from mock import patch
>>> @patch('module.ClassName2')
... @patch('module.ClassName1')
... def test(MockClass1, MockClass2):
...     module.ClassName1()
...     module.ClassName2()

...     assert MockClass1 is module.ClassName1
...     assert MockClass2 is module.ClassName2
...     assert MockClass1.called
...     assert MockClass2.called
...
>>> test()

  

doctest

doctest是Python中非常基本的一个测试方式,从名字可以看得出来,它是基于文档的测试,那么是这个文档有什么格式要求呢?简单的说就是测试用例都要写的和python交互方式下的输入输出一致,而其他格式的文字这可以当作是注释。假设文件shape.txt的内容如下

我们想要测试一个模块shape,其中有一个类Point和Circle。类Point代表一个二维空间中的点,而Circle这代表一个圆形,其拥有一个方法area返回计算其面积

>>> import shape
>>> circle = shape.Circle(x=5, y=5, radius=5)
>>> circle.x
5
>>> circle.y
5
>>> circle.radius
5
>>> circle.area()
78.53981633974483

  运行python -m doctest shape.txt 即可进行doctest。简单来说,doctest就像是个Python的命令行一样,把<<<之后的内容执行,然后与紧随在之后的输出进行对比。如执行circle.x,判断是不是为5,执行circle.area(),看起结果是否等于78.53981633974483

 

unittest

doctest虽然简单易用,但是当测试用例需要很多准备工作时,就显得力不从心,这是就该unittest大显身手的时候了。关于unittest,这篇文章就不说了,说多了没用,实干出真知。

转载于:https://www.cnblogs.com/jimmychange/p/3511310.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Snort是一种流行的入侵检测系统(IDS),它可以用于检测和防止网络上的恶意活动。而Python是一种广泛使用的编程语言。 要使用Snort检测Python代码,可以按照以下步骤进行: 1. 首先,安装和配置Snort。这可以通过下载Snort的最新版本并按照指南进行安装。然后,根据自己的需求进行配置,包括指定日志存储位置和启用相应的规则。 2. 然后,选择要检测的Python代码。可以选择已经开发的Python应用程序或脚本,或者自己编写一些示例代码。 3. 根据自己的需求和对Python代码的了解,编写适当的Snort规则来检测Python代码中的恶意行为。规则是Snort用于检测和报警的核心部分。可以使用Snort的语法和规则标准来编写规则,以检测Python代码中可能存在的安全问题,比如远程命令执行、文件读写等。 4. 导入所编写的规则到Snort中。将规则文件的路径指定到Snort的配置文件中,以便Snort能够加载并使用这些规则。 5. 启动Snort并监视网络流量。一旦有流量通过网络接口,Snort就会开始使用规则检测其中的Python代码。如果Snort检测到与规则匹配的Python代码,它将根据配置的设置采取相应的操作,比如记录日志、触发警报、阻止流量等。 总结来说,通过安装和配置Snort,编写适当的规则并监视流量,可以使用Snort检测Python代码中的恶意行为。这有助于保护网络安全,防止恶意Python代码对系统和数据造成危害。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值