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()方法中关闭数据库,这样,不必在每个测试方法中重复相同的代码。

相关文章
|
1月前
|
C语言 Python
python 调用c接口
【10月更文挑战第12天】 ctypes是Python的一个外部库,提供和C语言兼容的数据类型,可以很方便地调用C DLL中的函数
49 0
|
10天前
|
Java 测试技术 持续交付
【入门思路】基于Python+Unittest+Appium+Excel+BeautifulReport的App/移动端UI自动化测试框架搭建思路
本文重点讲解如何搭建App自动化测试框架的思路,而非完整源码。主要内容包括实现目的、框架设计、环境依赖和框架的主要组成部分。适用于初学者,旨在帮助其快速掌握App自动化测试的基本技能。文中详细介绍了从需求分析到技术栈选择,再到具体模块的封装与实现,包括登录、截图、日志、测试报告和邮件服务等。同时提供了运行效果的展示,便于理解和实践。
46 4
【入门思路】基于Python+Unittest+Appium+Excel+BeautifulReport的App/移动端UI自动化测试框架搭建思路
|
7天前
|
运维 监控 Python
自动化运维:使用Python脚本简化日常任务
【10月更文挑战第36天】在数字化时代,运维工作的效率和准确性成为企业竞争力的关键。本文将介绍如何通过编写Python脚本来自动化日常的运维任务,不仅提高工作效率,还能降低人为错误的风险。从基础的文件操作到进阶的网络管理,我们将一步步展示Python在自动化运维中的应用,并分享实用的代码示例,帮助读者快速掌握自动化运维的核心技能。
20 3
|
13天前
|
运维 监控 应用服务中间件
自动化运维:如何利用Python脚本提升工作效率
【10月更文挑战第30天】在快节奏的IT行业中,自动化运维已成为提升工作效率和减少人为错误的关键技术。本文将介绍如何使用Python编写简单的自动化脚本,以实现日常运维任务的自动化。通过实际案例,我们将展示如何用Python脚本简化服务器管理、批量配置更新以及监控系统性能等任务。文章不仅提供代码示例,还将深入探讨自动化运维背后的理念,帮助读者理解并应用这一技术来优化他们的工作流程。
|
14天前
|
运维 监控 Linux
自动化运维:如何利用Python脚本优化日常任务##
【10月更文挑战第29天】在现代IT运维中,自动化已成为提升效率、减少人为错误的关键技术。本文将介绍如何通过Python脚本来简化和自动化日常的运维任务,从而让运维人员能够专注于更高层次的工作。从备份管理到系统监控,再到日志分析,我们将一步步展示如何编写实用的Python脚本来处理这些任务。 ##
|
1月前
|
测试技术 Python
自动化测试项目学习笔记(一):unittest简单运行(初始化,清除,设置测试行为)
本文介绍了Python的unittest框架的基础用法,包括测试初始化(setup)、清除(tearDown)函数的使用,以及assertEqual和assertGreaterEqual等断言方法,并展示了如何创建测试用例,强调了测试函数需以test_开头才能被运行。
62 1
自动化测试项目学习笔记(一):unittest简单运行(初始化,清除,设置测试行为)
|
20天前
|
JSON 测试技术 持续交付
自动化测试与脚本编写:Python实践指南
自动化测试与脚本编写:Python实践指南
24 1
|
1月前
|
运维 监控 网络安全
自动化运维的魔法:如何用Python简化日常任务
【10月更文挑战第9天】在数字时代的浪潮中,运维人员面临着日益增长的挑战。本文将揭示如何通过Python脚本实现自动化运维,从而提高效率、减少错误,并让运维工作变得更具创造性。我们将探索一些实用的代码示例,这些示例将展示如何自动化处理文件、监控系统性能以及管理服务器配置等常见运维任务。准备好让你的运维工作升级换代了吗?让我们开始吧!
|
11天前
|
Web App开发 测试技术 数据安全/隐私保护
自动化测试的魔法:使用Python进行Web应用测试
【10月更文挑战第32天】本文将带你走进自动化测试的世界,通过Python和Selenium库的力量,展示如何轻松对Web应用进行自动化测试。我们将一起探索编写简单而强大的测试脚本的秘诀,并理解如何利用这些脚本来确保我们的软件质量。无论你是测试新手还是希望提升自动化测试技能的开发者,这篇文章都将为你打开一扇门,让你看到自动化测试不仅可行,而且充满乐趣。
|
1月前
|
测试技术 Python
自动化测试项目学习笔记(三):Unittest加载测试用例的四种方法
本文介绍了使用Python的unittest框架来加载测试用例的四种方法,包括通过测试用例类、模块、路径和逐条加载测试用例。
61 0
自动化测试项目学习笔记(三):Unittest加载测试用例的四种方法