unittest详解(三) 测试套件(TestSuite)

2024-04-30 02:18

本文主要是介绍unittest详解(三) 测试套件(TestSuite),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  • 在前面一章中示例了如何编写一个简单的测试,但有两个问题:
  1. 我们知道测试用例的执行顺序是根据测试用例名称顺序执行的,在不改变用例名称的情况下,我们怎么来控制用例执行的顺序呢?
  2. 一个测试文件,我们直接执行该文件即可,但如果有多个测试文件,怎么进行组织,总不能一个个文件执行吧?

要解决上面两个问题,我们就要用到测试套件(TestSuite)了

代码:

# coding = utf-8
import unittest
import warnings
from selenium import webdriver
from time import sleep
# 驱动文件路径
driverfile_path = r'D:\coship\Test_Framework\drivers\IEDriverServer.exe'class CmsLoginTest(unittest.TestCase):def setUp(self):# 这行代码的作用是忽略一些告警打印warnings.simplefilter("ignore", ResourceWarning)self.driver = webdriver.Ie(executable_path=driverfile_path)self.driver.get("http://172.21.13.83:28080/")def tearDown(self):self.driver.quit()def test_login1(self):'''用户名、密码为空'''self.driver.find_element_by_css_selector("#imageField").click()error_message1 = self.driver.find_element_by_css_selector("[for='loginName']").texterror_message2 = self.driver.find_element_by_css_selector("[for='textfield']").textself.assertEqual(error_message1, '用户名不能为空')self.assertEqual(error_message2, '密码不能为空')def test_login3(self):'''用户名、密码正确'''self.driver.find_element_by_css_selector("[name='admin.loginName']").send_keys("autotest")self.driver.find_element_by_css_selector("[name='admin.password']").send_keys("111111")self.driver.find_element_by_css_selector("#imageField").click()sleep(1)self.driver.switch_to.frame("topFrame")username = self.driver.find_element_by_css_selector("#nav_top>ul>li>a").textself.assertEqual(username,"autotest")def test_login2(self):'''用户名正确,密码错误'''self.driver.find_element_by_css_selector("[name='admin.loginName']").send_keys("autotest")self.driver.find_element_by_css_selector("[name='admin.password']").send_keys("123456")self.driver.find_element_by_css_selector("#imageField").click()error_message = self.driver.find_element_by_css_selector(".errorMessage").textself.assertEqual(error_message, '密码错误,请重新输入!')def test_login4(self):'''用户名不存在'''self.driver.find_element_by_css_selector("[name='admin.loginName']").send_keys("test007")self.driver.find_element_by_css_selector("[name='admin.password']").send_keys("123456")self.driver.find_element_by_css_selector("#imageField").click()error_message = self.driver.find_element_by_css_selector(".errorMessage").textself.assertEqual(error_message, '用户不存在!')if __name__ == "__main__":# 构造测试套件suite = unittest.TestSuite()suite.addTest(CmsLoginTest("test_login1"))suite.addTest(CmsLoginTest("test_login2"))suite.addTest(CmsLoginTest("test_login4"))suite.addTest(CmsLoginTest("test_login3"))# 执行测试runner = unittest.TextTestRunner(verbosity=2)runner.run(suite)

注:verbosity 参数可以控制输出的错误报告的详细程度,默认是 1;如果设为 0,则不输出每一用例的执行结果;如果设为 2,则输出详细的执行结果

执行结果:

"C:\Program Files\Python36\python.exe" D:/Git/Test_Framework/utils/1.py
test_login1 (__main__.CmsLoginTest)
用户名、密码为空 ... ok
test_login2 (__main__.CmsLoginTest)
用户名正确,密码错误 ... ok
test_login4 (__main__.CmsLoginTest)
用户名不存在 ... ok
test_login3 (__main__.CmsLoginTest)
用户名、密码正确 ... ok----------------------------------------------------------------------
Ran 4 tests in 44.818sOKProcess finished with exit code 0

从用例的执行结果中我们可以看到,用例的执行顺序是按照添加用例时的顺序来执行的

一个一个地添加测试用例到测试套件中,有点麻烦,其实我们可以把要执行的测试用例用个列表来管理,然后再把这个列表添加到测试套件中,如下代码:

if __name__ == "__main__":# 构造测试套件suite = unittest.TestSuite()test_cases = [CmsLoginTest("test_login1"),CmsLoginTest("test_login2"),CmsLoginTest("test_login4"),CmsLoginTest("test_login3")]suite.addTests(test_cases)# 执行测试runner = unittest.TextTestRunner(verbosity=2)runner.run(suite)

下面我们就来讲讲多个文件的测试用例组织。

假如我有两个系统的登录需要测试,测试用例分别放在两个文件中(cmslogin.py,smelogin.py),现在我需要把这两个文件中的用例添加到一个测试套件中来执行,为此我们要重新建立一个叫run_all.py的文件

import unittest
from cmslogin import CmsLoginTest
from smelogin import SmeLoginTestif __name__ == "__main__":# 构造测试套件suite = unittest.TestSuite()test_cases = [CmsLoginTest("test_login1"),CmsLoginTest("test_login2"),CmsLoginTest("test_login4"),CmsLoginTest("test_login3"),SmeLoginTest("test_login1"),SmeLoginTest("test_login2")]suite.addTests(test_cases)# 执行测试runner = unittest.TextTestRunner(verbosity=2)runner.run(suite)

还可以用addTests + TestLoader方法来添加用例,但是这种方法是无法对case进行排序的

import unittest
from cmslogin import CmsLoginTest
from smelogin import SmeLoginTestif __name__ == "__main__":# 构造测试套件suite = unittest.TestSuite()# 第一种方法:传入'模块名.TestCase名'suite.addTests(unittest.TestLoader().loadTestsFromName('cmslogin.CmsLoginTest'))suite.addTests(unittest.TestLoader().loadTestsFromName('smelogin.SmeLoginTest'))# 这里还可以把'模块名.TestCase名'放到一个列表中suite.addTests(unittest.TestLoader().loadTestsFromNames(['cmslogin.CmsLoginTest','smelogin.SmeLoginTest']))# 第二种方法:传入TestCasesuite.addTests(unittest.TestLoader().loadTestsFromTestCase(CmsLoginTest))# 执行测试runner = unittest.TextTestRunner(verbosity=2)runner.run(suite)

这篇关于unittest详解(三) 测试套件(TestSuite)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/947688

相关文章

JAVA系统中Spring Boot应用程序的配置文件application.yml使用详解

《JAVA系统中SpringBoot应用程序的配置文件application.yml使用详解》:本文主要介绍JAVA系统中SpringBoot应用程序的配置文件application.yml的... 目录文件路径文件内容解释1. Server 配置2. Spring 配置3. Logging 配置4. Ma

mac中资源库在哪? macOS资源库文件夹详解

《mac中资源库在哪?macOS资源库文件夹详解》经常使用Mac电脑的用户会发现,找不到Mac电脑的资源库,我们怎么打开资源库并使用呢?下面我们就来看看macOS资源库文件夹详解... 在 MACOS 系统中,「资源库」文件夹是用来存放操作系统和 App 设置的核心位置。虽然平时我们很少直接跟它打交道,但了

关于Maven中pom.xml文件配置详解

《关于Maven中pom.xml文件配置详解》pom.xml是Maven项目的核心配置文件,它描述了项目的结构、依赖关系、构建配置等信息,通过合理配置pom.xml,可以提高项目的可维护性和构建效率... 目录1. POM文件的基本结构1.1 项目基本信息2. 项目属性2.1 引用属性3. 项目依赖4. 构

Rust 数据类型详解

《Rust数据类型详解》本文介绍了Rust编程语言中的标量类型和复合类型,标量类型包括整数、浮点数、布尔和字符,而复合类型则包括元组和数组,标量类型用于表示单个值,具有不同的表示和范围,本文介绍的非... 目录一、标量类型(Scalar Types)1. 整数类型(Integer Types)1.1 整数字

Java操作ElasticSearch的实例详解

《Java操作ElasticSearch的实例详解》Elasticsearch是一个分布式的搜索和分析引擎,广泛用于全文搜索、日志分析等场景,本文将介绍如何在Java应用中使用Elastics... 目录简介环境准备1. 安装 Elasticsearch2. 添加依赖连接 Elasticsearch1. 创

Redis缓存问题与缓存更新机制详解

《Redis缓存问题与缓存更新机制详解》本文主要介绍了缓存问题及其解决方案,包括缓存穿透、缓存击穿、缓存雪崩等问题的成因以及相应的预防和解决方法,同时,还详细探讨了缓存更新机制,包括不同情况下的缓存更... 目录一、缓存问题1.1 缓存穿透1.1.1 问题来源1.1.2 解决方案1.2 缓存击穿1.2.1

PyTorch使用教程之Tensor包详解

《PyTorch使用教程之Tensor包详解》这篇文章介绍了PyTorch中的张量(Tensor)数据结构,包括张量的数据类型、初始化、常用操作、属性等,张量是PyTorch框架中的核心数据结构,支持... 目录1、张量Tensor2、数据类型3、初始化(构造张量)4、常用操作5、常用属性5.1 存储(st

Python 中 requests 与 aiohttp 在实际项目中的选择策略详解

《Python中requests与aiohttp在实际项目中的选择策略详解》本文主要介绍了Python爬虫开发中常用的两个库requests和aiohttp的使用方法及其区别,通过实际项目案... 目录一、requests 库二、aiohttp 库三、requests 和 aiohttp 的比较四、requ

VUE动态绑定class类的三种常用方式及适用场景详解

《VUE动态绑定class类的三种常用方式及适用场景详解》文章介绍了在实际开发中动态绑定class的三种常见情况及其解决方案,包括根据不同的返回值渲染不同的class样式、给模块添加基础样式以及根据设... 目录前言1.动态选择class样式(对象添加:情景一)2.动态添加一个class样式(字符串添加:情

Python在固定文件夹批量创建固定后缀的文件(方法详解)

《Python在固定文件夹批量创建固定后缀的文件(方法详解)》文章讲述了如何使用Python批量创建后缀为.md的文件夹,生成100个,代码中需要修改的路径、前缀和后缀名,并提供了注意事项和代码示例,... 目录1. python需求的任务2. Python代码的实现3. 代码修改的位置4. 运行结果5.