python接口自动化(二十二)--unittest执行顺序隐藏的坑(详解)

简介: 大多数的初学者在使用 unittest 框架时候,不清楚用例的执行顺序到底是怎样的。对测试类里面的类和方法分不清楚,不知道什么时候执行,什么时候不执行。虽然或许通过代码实现了,也是稀里糊涂的一知半解,这样还好,好歹自己鼓捣出了,但是时间和效率并不是很高,下次遇到还是老样子。那么本篇通过最简单案例来给给为小伙伴详细讲解、演示一下 unittest 执行顺序。

简介


  

大多数的初学者在使用 unittest 框架时候,不清楚用例的执行顺序到底是怎样的。对测试类里面的类和方法分不清楚,不知道什么时候执行,什么时候不执行。虽然或许通过代码实现了,也是稀里糊涂的一知半解,这样还好,好歹自己鼓

捣出了,但是时间和效率并不是很高,下次遇到还是老样子。那么本篇通过最简单案例来给给为小伙伴详细讲解、演示一下 unittest 执行顺序。


实例代码



1232840-20190424083353030-1129366547.png


参考代码



 # coding=utf-8
  #1.先设置编码,utf-8可支持中英文,如上,一般放在第一行
  #2.注释:包括记录创建时间,创建人,项目名称。
  '''
  Created on 2019-4-23
  @author: 北京-宏哥
  Project:学习和使用unittest框架编写测试用例执行顺序
  '''
 #3.导入unittest模块
 import unittest
 #4.执行顺序和运行测试
import unittest
 class TestLogin(unittest.TestCase):
     def test_login_blog(self):
         """登录博客园
        :return:
         """
     def test_add_essay(self):
         """ 添加随笔
         :return:
         """
     def test_release_essay(self):
         """ 发布随笔
         :return:
         """
     def test_quit_blog(self):
         """退出博客园
        :return:
         """
 if __name__ == "__main__()":
    unittest.main()


这是一个标准的使用unittest进行测试的例子,写完后心里美滋滋,嗯,就按照一贯思路代码会按照这个顺序测就可以了。结果一运行。就傻眼了


1232840-20190424083919359-1934783132.png

1232840-20190424144647874-1636973817.png

  

这时候自己心里犯嘀咕,这是什么鬼,怎么回事呢。执行的顺序乱了。第一个执行的测试用例并不是登录博客园,而是添加随笔,此时用户还没登录博客园,进行添加随笔的话会直接报错,导致用例失败。

到这里有些小伙伴可能会说,为什么要让测试用例之间有所依赖呢?

  

的确,如果完全没依赖,测试用例的执行顺序是不需要关注的。但是这样对于用例的设计和实现,要求就高了许多。而对博客园来说,一个系统内的操作,是有很大的关联性的。以添加随笔为例,随笔内的每个操作都有一个前提,你需要

登录博客园才能添加随笔。所以要实现用例之间的完全解耦,需要每个用例开始之前,检测用户的登录状态。

  

如果可以控制测试用例的执行顺序,按照功能流程一遍走下来,节省的代码量是非常可观的,阅读测试用例也会清晰明了许多。


如何控制unittest用例执行的顺序呢?



1、带大家先看看源码,unittest是怎么样对用例进行排序的。在loader.pyloadTestsFromTestCase方法里边,调用了getTestCaseNames方法来获取测试用例的名称


1232840-20190424111758350-210516870.png


2、从源码可以清楚地看到,getTestCaseNames方法对测试用例的名称进行了排序


1232840-20190424111938233-1864966866.png


3、一步一步跟进去,查看其排序方法


1232840-20190424112402962-614080194.png


4、根据排序规则,unittest执行测试用例,默认是根据ASCII码的顺序加载测试用例,数字与字母的顺序为:0-9,A-Z,a-z。

5、做个小demo,看看是不是我们所说的那种排序规则


1232840-20190424112753576-29735455.png


6、从上边的运行结果,我们可以看出是:unittest执行测试用例,默认是根据ASCII码的顺序加载测试用例,数字与字母的顺序为:0-9,A-Z,a-z。

7、基于unittest的机制,如何控制用例执行顺序呢?查了一些网上的资料,主要介绍了两种方式:


方式1,通过TestSuite类的addTest方法,按顺序加载测试用例


1232840-20190424144432296-1513536059.png


参考代码



# coding=utf-8
  #1.先设置编码,utf-8可支持中英文,如上,一般放在第一行
 #2.注释:包括记录创建时间,创建人,项目名称。
  '''
  Created on 2019-4-23
  @author: 北京-宏哥
  Project:学习和使用unittest框架编写测试用例执行顺序
  '''
 #3.导入unittest模块
 import unittest
 #4.执行顺序和运行测试
 import unittest
 class TestLogin(unittest.TestCase):
     def setUp(self):
         pass
     def test_login_blog(self):
         """登录博客园
         :return:
         """
         print("登录博客园")
     def test_add_essay(self):
         """ 添加随笔
         :return:
         """
         print("添加随笔")
     def test_release_essay(self):
         """ 发布随笔
         :return:
         """
        print("发布随笔")
     def test_quit_blog(self):
         """退出博客园
        :return:
         """
         print("退出博客园")
     def tearDown(self):
         pass
 if __name__ == '__main__':
     # 启动单元测试
     # unittest.main()
     # 获取TestSuite的实例对象
     suite = unittest.TestSuite()
     # 将测试用例添加到测试容器中
     suite.addTest(TestLogin('test_login_blog'))
     suite.addTest(TestLogin('test_add_essay'))
     suite.addTest(TestLogin('test_release_essay'))
     suite.addTest(TestLogin('test_quit_blog'))
     # 创建TextTestRunner类的实例对象
    runner = unittest.TextTestRunner()
     runner.run(suite)
     #unittest.TextTestRunner(verbosity=3).run(suite)


方式2,通过修改函数名的方式


1232840-20190424145005526-1651743407.png


参考代码



 # coding=utf-8
  #1.先设置编码,utf-8可支持中英文,如上,一般放在第一行
  #2.注释:包括记录创建时间,创建人,项目名称。
  '''
  Created on 2019-4-23
  @author: 北京-宏哥
 Project:学习和使用unittest框架编写测试用例执行顺序
  '''
 #3.导入unittest模块
 import unittest
 #4.执行顺序和运行测试
 import unittest
 class TestLogin(unittest.TestCase):
    def setUp(self):
         pass
     def test_1_login_blog(self):
         """登录博客园
         :return:
         """
         print("登录博客园")
     def test_2_add_essay(self):
         """ 添加随笔
         :return:
         """
         print("添加随笔")
     def test_3_release_essay(self):
         """ 发布随笔
         :return:
         """
         print("发布随笔")
     def test_4_quit_blog(self):
         """退出博客园
         :return:
         """
         print("退出博客园")
     def tearDown(self):
         pass
  if __name__ == '__main__':
     # 启动单元测试
     unittest.main()


拓展练习



1、实例

1232840-20190423130704591-2042375124.png


2、运行结果


1232840-20190423131122823-559985546.png


3、运行结果分析


1、从运行结果可以看出执行顺序:


  start!-执行测试用例 01-end!

  start!-执行测试用例 02-end!

  start!-执行测试用例 03-end!


2、从执行结果可以看出几点


  --先执行的前置 setUp,然后执行的用例(test*),最后执行的后置 tearDown

  --测试用例(test*)的执行顺序是根据 01-02-03 执行的,也就是说根据用例名称来顺序执行的

  --addtest(self)这个方法没执行,说明只执行 test 开头的用例


参考代码


 # coding=utf-8
  #1.先设置编码,utf-8可支持中英文,如上,一般放在第一行
  #2.注释:包括记录创建时间,创建人,项目名称。
  '''
  Created on 2019-4-23
  @author: 北京-宏哥
 Project:学习和使用unittest框架编写测试用例思路
  '''
 #3.导入unittest模块
 import unittest
 #4.执行顺序和运行测试
 import time
 class Test(unittest.TestCase):
     def setUp(self):
         print ("start!")
     def tearDown(self):
        time.sleep(1)
         print ("end!")
     def test01(self):
         print ("执行测试用例 01")
     def test03(self):
         print ("执行测试用例 03")
     def test02(self):
         print ("执行测试用例 02")
     def addtest(self):
         print ("add 方法")
 if __name__ == "__main__":
     unittest.main()


小结



1、这个执行顺序,看似简单,实则不简单,只有掌握最简单的才可以应付最复杂的。

2、setUp()tearDown()方法有什么用呢?设想你的测试需要启动一个数据库,这时,就可以在setUp()方法中连接数据库,在tearDown()方法中关闭数据库,这样,不必在每个测试方法中重复相同的代码。

相关文章
|
5天前
|
搜索推荐 Python
使用Python自动化生成物业通知单
本文介绍如何使用Python结合Pandas和python-docx库自动化生成物业通知单。通过读取Excel数据并填充至Word模板,实现高效准确的通知单批量制作。包括环境准备、代码解析及效果展示,适用于物业管理场景。
43 14
|
9天前
|
数据采集 数据可视化 数据挖掘
利用Python自动化处理Excel数据:从基础到进阶####
本文旨在为读者提供一个全面的指南,通过Python编程语言实现Excel数据的自动化处理。无论你是初学者还是有经验的开发者,本文都将帮助你掌握Pandas和openpyxl这两个强大的库,从而提升数据处理的效率和准确性。我们将从环境设置开始,逐步深入到数据读取、清洗、分析和可视化等各个环节,最终实现一个实际的自动化项目案例。 ####
|
10天前
|
数据采集 存储 XML
Python爬虫:深入探索1688关键词接口获取之道
在数字化经济中,数据尤其在电商领域的价值日益凸显。1688作为中国领先的B2B平台,其关键词接口对商家至关重要。本文介绍如何通过Python爬虫技术,合法合规地获取1688关键词接口,助力商家洞察市场趋势,优化营销策略。
|
10天前
|
Android开发 开发者 Python
通过标签清理微信好友:Python自动化脚本解析
微信已成为日常生活中的重要社交工具,但随着使用时间增长,好友列表可能变得臃肿。本文介绍了一个基于 Python 的自动化脚本,利用 `uiautomator2` 库,通过模拟用户操作实现根据标签批量清理微信好友的功能。脚本包括环境准备、类定义、方法实现等部分,详细解析了如何通过标签筛选并删除好友,适合需要批量管理微信好友的用户。
21 7
|
9天前
|
安全 API 文件存储
Yagmail邮件发送库:如何用Python实现自动化邮件营销?
本文详细介绍了如何使用Yagmail库实现自动化邮件营销。Yagmail是一个简洁强大的Python库,能简化邮件发送流程,支持文本、HTML邮件及附件发送,适用于数字营销场景。文章涵盖了Yagmail的基本使用、高级功能、案例分析及最佳实践,帮助读者轻松上手。
20 4
|
10天前
|
JSON 安全 API
Python调用API接口的方法
Python调用API接口的方法
50 5
|
8天前
|
敏捷开发 测试技术 持续交付
自动化测试之美:从零开始搭建你的Python测试框架
在软件开发的马拉松赛道上,自动化测试是那个能让你保持节奏、避免跌宕起伏的神奇小助手。本文将带你走进自动化测试的世界,用Python这把钥匙,解锁高效、可靠的测试框架之门。你将学会如何步步为营,构建属于自己的测试庇护所,让代码质量成为晨跑时清新的空气,而不是雾霾中的忧虑。让我们一起摆脱手动测试的繁琐枷锁,拥抱自动化带来的自由吧!
|
15天前
|
监控 数据挖掘 数据安全/隐私保护
Python脚本:自动化下载视频的日志记录
Python脚本:自动化下载视频的日志记录
|
2月前
|
机器学习/深度学习 人工智能 运维
构建高效运维体系:从自动化到智能化的演进
本文探讨了如何通过自动化和智能化手段,提升IT运维效率与质量。首先介绍了自动化在简化操作、减少错误中的作用;然后阐述了智能化技术如AI在预测故障、优化资源中的应用;最后讨论了如何构建一个既自动化又智能的运维体系,以实现高效、稳定和安全的IT环境。
73 4
|
2月前
|
运维 Linux Apache
,自动化运维成为现代IT基础设施的关键部分。Puppet是一款强大的自动化运维工具
【10月更文挑战第7天】随着云计算和容器化技术的发展,自动化运维成为现代IT基础设施的关键部分。Puppet是一款强大的自动化运维工具,通过定义资源状态和关系,确保系统始终处于期望配置状态。本文介绍Puppet的基本概念、安装配置及使用示例,帮助读者快速掌握Puppet,实现高效自动化运维。
63 4