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

相关文章
|
4天前
|
测试技术 API 网络架构
Python的api自动化测试 编写测试用例
【4月更文挑战第18天】使用Python进行API自动化测试,可以结合`requests`库发送HTTP请求和`unittest`(或`pytest`)编写测试用例。以下示例: 1. 安装必要库:`pip install requests unittest` 2. 创建`test_api.py`,导入库,定义基础URL。 3. 创建继承自`unittest.TestCase`的测试类,包含`setUp`和`tearDown`方法。 4. 编写测试用例,如`test_get_users`,检查响应状态码和内容。 5. 运行测试:`python -m unittest test_api.py`
12 2
|
4天前
|
JSON 测试技术 API
Python的Api自动化测试使用HTTP客户端库发送请求
【4月更文挑战第18天】在Python中进行HTTP请求和API自动化测试有多个库可选:1) `requests`是最流行的选择,支持多种请求方法和内置JSON解析;2) `http.client`是标准库的一部分,适合需要低级别控制的用户;3) `urllib`提供URL操作,适用于复杂请求;4) `httpx`拥有类似`requests`的API,提供现代特性和异步支持。根据具体需求选择,如多数情况`requests`已足够。
9 3
|
5天前
|
人工智能 Python
【Python实用技能】建议收藏:自动化实现网页内容转PDF并保存的方法探索(含代码,亲测可用)
【Python实用技能】建议收藏:自动化实现网页内容转PDF并保存的方法探索(含代码,亲测可用)
24 0
|
5天前
|
测试技术 持续交付 API
Python的UI自动化测试
【4月更文挑战第17天】Python UI自动化测试涉及Selenium(Web)、Appium(移动应用)和PyQt(桌面应用)等框架。基本步骤包括确定测试目标、选择合适框架、安装配置、编写测试脚本、运行调试以及集成到CI/CD流程。注意自动化测试不能完全取代人工测试,应根据需求平衡使用。
8 1
|
6天前
|
前端开发 测试技术 C++
Python自动化测试面试:unittest、pytest与Selenium详解
【4月更文挑战第19天】本文聚焦Python自动化测试面试,重点讨论unittest、pytest和Selenium三大框架。unittest涉及断言、TestSuite和覆盖率报告;易错点包括测试代码冗余和异常处理。pytest涵盖fixtures、参数化测试和插件系统,要注意避免过度依赖unittest特性。Selenium的核心是WebDriver操作、等待策略和测试报告生成,强调智能等待和元素定位策略。掌握这些关键点将有助于提升面试表现。
20 0
|
6天前
|
XML Web App开发 测试技术
python的Web自动化测试
【4月更文挑战第16天】Python在Web自动化测试中广泛应用,借助Selenium(支持多浏览器交互)、BeautifulSoup(解析HTML/XML)、Requests(发送HTTP请求)和Unittest(测试框架)等工具。测试步骤包括环境搭建、编写测试用例、初始化浏览器、访问页面、操作元素、验证结果、关闭浏览器及运行报告。注意浏览器兼容性、动态内容处理和错误处理。这些组合能提升测试效率和质量。
11 6
|
测试技术 C++ Python
【进阶Python】第九讲:单元测试之unittest
在开发中,为了保证项目的正常运行,能够按照预期正确的输出我们想要的结果,单元测试时必不可少的。在Python中,用于测试的库有很多,其中较为常用的就是本文的主角--unittest。本文会详细介绍unittest的两种常见用法,同时会介绍使用频率相对较少的跳过、复用等方法。
【进阶Python】第九讲:单元测试之unittest
|
测试技术 Python
python单元测试之unittest
现在python单元测试也要慢慢作正规了。 最终我可是要用django和mock的哟。
9089 0
|
2天前
|
机器学习/深度学习 数据挖掘 API
pymc,一个灵活的的 Python 概率编程库!
pymc,一个灵活的的 Python 概率编程库!
5 1

热门文章

最新文章