From: http://www.testclass.net/pyunit/test_example_2/

背景

接上一节的弱密码例子,我们的用例尽管运行的不错,但还是有点问题。

假如我们需要增加一些测试数据,那么我们就必须去修改setUp方法,在test_data列表中增加数据,频繁修改代码以适应一些不变的测试场景,这是没有必要的开销,可以想办法去优化。

我们可以把测试数据保存在文件里,通过读取文件的方式,每次动态从测试用例读取数据,这样数据的改变并不会影响用例,用例逻辑相对稳定,维护成本得到一定的降低。

设计测试数据

我们可以把测试数据保存成json格式,json格式的数据在各个语言间有较好的通用性,比较适合复用。

新建user_data.json文件,内容如下

[
{"name":"jack","password":"Iloverose"},
{"name":"rose","password":"Ilovejack"},
{"name":"tom","password":"password123"}
]

使用python的json库解析上面的json文件,可以得到如上节中test_data一致的数据。

代码

新建test_password_2.py,内容如下

import unittest
import json class PasswordWithJsonTeseCase(unittest.TestCase):
data_file_path = './user_data.json' def setUp(self):
print('set up')
self.test_data = json.loads(open(self.data_file_path).read()) def test_week_password(self):
for data in self.test_data:
passwd = data['password'] self.assertTrue(len(passwd) >= 6) msg = "user %s has a weak password" %(data['name'])
self.assertTrue(passwd != 'password', msg)
self.assertTrue(passwd != 'password123', msg) def test_dummy(self):
pass if __name__ == '__main__':
unittest.main()

跟上一节相比,最大的不同点是现在test_data通过解析json文件的方式来赋值self.test_data = json.loads(open(self.data_file_path).read())

执行测试文件,结果应该与上一节一致。

发现问题

上面的代码有2个测试方法:test_week_passwordtest_dummy。由于setUp会在每个测试方法执行之前执行一次,那么setUp方法会执行2次,相应的json文件也会读取2次。如果测试方法多的话,那么反复读取json文件对性能来说是一个巨大的挑战。

优化

对于上面的测试数据读取场景,我们可以在所有测试方法执行前读取一次数据,毕竟测试数据在所有测试方法执行过程中是保持不变的。

setUpClass()和tearDownClass()

  • setUpClass方法在每个测试用例类执行之前会执行一次,接收该class作为唯一的参数,并且必须使用装饰器classmethod()
  • tearDownClass: 在所有测试方法执行完之后被调用1次,调用方式跟上面的方法类似

重构

下面我们重构代码以达到只读取1次测试数据的目的,新建文件`test_password_3.py,内容如下

import unittest
import json class WeakPasswordTeseCase(unittest.TestCase): @classmethod
def setUpClass(kls):
data_file_path = './user_data.json'
print('before all test methods')
with open(data_file_path) as f:
kls.test_data = json.loads(f.read()) def test_week_password(self):
for data in self.test_data:
passwd = data['password'] self.assertTrue(len(passwd) >= 6) msg = "user %s has a weak password" %(data['name'])
self.assertTrue(passwd != 'password', msg)
self.assertTrue(passwd != 'password123', msg) def test_dummy(self):
pass if __name__ == '__main__':
unittest.main()

有几点需要提及一下

  • 使用open 方法的with模式可以在读取文件后自动关闭文件
  • 在setUpClass方法中可以直接设置变量,比如kls.test_data = json.loads(f.read()),在其他测试方法中可以被访问

测试教程网.unittest教程.4. 实例: 读取测试数据并测试弱密码的更多相关文章

  1. 测试教程网.unittest教程.3. 实例: 测试弱密码

    From: http://www.testclass.net/pyunit/test_example_1/ 背景 考虑这样一个测试弱密码的实例,这个我们在pytest相关教程中也有过描述. 我们需要判 ...

  2. 测试教程网.unittest教程.5. 实例: 找出所有是弱密码的用户

    From: http://www.testclass.net/pyunit/test_example_3/ 背景 当我们的测试数据是下面这些的时候,我们的用例是有问题的. [ {"name& ...

  3. 测试教程网.unittest教程.2. 基本用法

    From: http://www.testclass.net/pyunit/basic_example/ 我们通过最简单的例子来看一下unittest的基本用法,下面的代码测试了3个python字符串 ...

  4. 测试教程网.unittest教程.6. 命令行接口

    From: http://www.testclass.net/pyunit/commind_line_interface/ 背景 unittest支持命令行接口,我们可以在命令行里指定运行具体的测试用 ...

  5. 测试教程网.unittest教程.1. 基本概念

    From:http://www.testclass.net/pyunit/basic_concept/ unittest是python自带的单元测试框架,有时候又被称为”PyUnit”,是python ...

  6. 测试教程网.unittest教程.8. 断言异常

    From: http://www.testclass.net/pyunit/assert_raise/ 背景 我们有时候需要断言一些方法会抛出异常,这些异常需要符合我们的预期. 代码 新建test_e ...

  7. 测试教程网.unittest教程.7. 各种断言方法

    From: http://www.testclass.net/pyunit/assert/ 背景 unittest支持各种断言方法. 断言列表 官方文档 方法 检查点 assertEqual(a, b ...

  8. Java 实例 - 读取文件内容

    原文作者:菜鸟教程 原文链接:Java 实例 - 读取文件内容(建议前往原文以获得最佳体验) 按行读取文本文件 import java.io.*; public class Main { public ...

  9. Java-Runoob-高级教程-实例-字符串:11. Java 实例 - 字符串性能比较测试

    ylbtech-Java-Runoob-高级教程-实例-字符串:11. Java 实例 - 字符串性能比较测试 1.返回顶部 1. Java 实例 - 字符串性能比较测试  Java 实例 以下实例演 ...

随机推荐

  1. SpringBoot 配置文件详解

    springboot采纳了建立生产就绪spring应用程序的观点. Spring Boot优先于配置的惯例,旨在让您尽快启动和运行.在一般情况下,我们不需要做太多的配置就能够让spring boot正 ...

  2. 修改JAVA代码,需要重启Tomcat的原因

    准确的说只有修改方法中的内容才不需要重启,因为tomcat中对于方法的调用是动态的,调用方法的时候,方法的内容才会被加载 新增成员变量,方法,或修改静态方法和静态变量.创建新的类 这些都是需要重启的, ...

  3. opencv的DMatch

    1.DMatch是描述图像匹配信息的类 /** @brief Class for matching keypoint descriptors query descriptor index, train ...

  4. linux 系统 目录,以部分及相关命令

    linux 系统里的文件类型有: b. d.l. c. -  .s (块设备.目录.软连接.数字串设备.普通文件(文本.二进行文件).socket文件 ) ls 命令 ls -a  查看当前目录下的所 ...

  5. python selenium自动化点击页面链接测试

    python selenium自动化点击页面链接测试 需求:现在有一个网站的页面,我希望用python自动化的测试点击这个页面上所有的在本窗口跳转,并且是本站内的链接,前往到链接页面之后在通过后退返回 ...

  6. hdu2255 奔小康赚大钱 二分图最佳匹配--KM算法

    传说在遥远的地方有一个非常富裕的村落,有一天,村长决定进行制度改革:重新分配房子.这可是一件大事,关系到人民的住房问题啊.村里共有n间房间,刚好有n家老百姓,考虑到每家都要有房住(如果有老百姓没房子住 ...

  7. 【BZOJ4521】【CQOI2016】手机号码

    感觉数位dp好恶心…… 原题: 人们选择手机号码时都希望号码好记.吉利.比如号码中含有几位相邻的相同数字.不含谐音不 吉利的数字等.手机运营商在发行新号码时也会考虑这些因素,从号段中选取含有某些特征的 ...

  8. 如何安装psutil以及提示缺少python.h头文件

    下载psutil 下载地址https://pypi.python.org/packages/57/93/47a2e3befaf194ccc3d05ffbcba2cdcdd22a231100ef7e4c ...

  9. 自制操作系统Antz -- 系列文章

    自制操作系统Antz day10——实现shell(上) AntzUhl 2018-10-10 16:25 阅读:192 评论:0   Linux内核源码分析 day01——内存寻址 AntzUhl ...

  10. day 27 网络通信协议 tup udp 下的socket

    1.osi七层模型 通信流程 socket(抽象层): 结合上图来看,socket在哪一层呢,我们继续看下图 socket在内的五层通讯流程: 2.TCP/UDP的区别: TCP是以数据流的形式传输, ...