在前面一章中示例了如何编写一个简单的测试,但有两个问题:

  1. 我们知道测试用例的执行顺序是根据测试用例名称顺序执行的,在不改变用例名称的情况下,我们怎么来控制用例执行的顺序呢?
  2. 一个测试文件,我们直接执行该文件即可,但如果有多个测试文件,怎么进行组织,总不能一个个文件执行吧?

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

代码:

  1. # coding = utf-8
  2. import unittest
  3. import warnings
  4. from selenium import webdriver
  5. from time import sleep
  6. # 驱动文件路径
  7. driverfile_path = r'D:\coship\Test_Framework\drivers\IEDriverServer.exe'
  8.  
  9. class CmsLoginTest(unittest.TestCase):
  10. def setUp(self):
  11. # 这行代码的作用是忽略一些告警打印
  12. warnings.simplefilter("ignore", ResourceWarning)
  13. self.driver = webdriver.Ie(executable_path=driverfile_path)
  14. self.driver.get("http://172.21.13.83:28080/")
  15.  
  16. def tearDown(self):
  17. self.driver.quit()
  18.  
  19. def test_login1(self):
  20. '''用户名、密码为空'''
  21. self.driver.find_element_by_css_selector("#imageField").click()
  22. error_message1 = self.driver.find_element_by_css_selector("[for='loginName']").text
  23. error_message2 = self.driver.find_element_by_css_selector("[for='textfield']").text
  24. self.assertEqual(error_message1, '用户名不能为空')
  25. self.assertEqual(error_message2, '密码不能为空')
  26.  
  27. def test_login3(self):
  28. '''用户名、密码正确'''
  29. self.driver.find_element_by_css_selector("[name='admin.loginName']").send_keys("autotest")
  30. self.driver.find_element_by_css_selector("[name='admin.password']").send_keys("")
  31. self.driver.find_element_by_css_selector("#imageField").click()
  32. sleep(1)
  33. self.driver.switch_to.frame("topFrame")
  34. username = self.driver.find_element_by_css_selector("#nav_top>ul>li>a").text
  35. self.assertEqual(username,"autotest")
  36.  
  37. def test_login2(self):
  38. '''用户名正确,密码错误'''
  39. self.driver.find_element_by_css_selector("[name='admin.loginName']").send_keys("autotest")
  40. self.driver.find_element_by_css_selector("[name='admin.password']").send_keys("")
  41. self.driver.find_element_by_css_selector("#imageField").click()
  42. error_message = self.driver.find_element_by_css_selector(".errorMessage").text
  43. self.assertEqual(error_message, '密码错误,请重新输入!')
  44.  
  45. def test_login4(self):
  46. '''用户名不存在'''
  47. self.driver.find_element_by_css_selector("[name='admin.loginName']").send_keys("test007")
  48. self.driver.find_element_by_css_selector("[name='admin.password']").send_keys("")
  49. self.driver.find_element_by_css_selector("#imageField").click()
  50. error_message = self.driver.find_element_by_css_selector(".errorMessage").text
  51. self.assertEqual(error_message, '用户不存在!')
  52.  
  53. if __name__ == "__main__":
  54. # 构造测试套件
  55. suite = unittest.TestSuite()
  56. suite.addTest(CmsLoginTest("test_login1"))
  57. suite.addTest(CmsLoginTest("test_login2"))
  58. suite.addTest(CmsLoginTest("test_login4"))
  59. suite.addTest(CmsLoginTest("test_login3"))
  60. # 执行测试
  61. runner = unittest.TextTestRunner(verbosity=2)
  62. runner.run(suite)

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

执行结果:

  1. "C:\Program Files\Python36\python.exe" D:/Git/Test_Framework/utils/1.py
  2. test_login1 (__main__.CmsLoginTest)
  3. 用户名、密码为空 ... ok
  4. test_login2 (__main__.CmsLoginTest)
  5. 用户名正确,密码错误 ... ok
  6. test_login4 (__main__.CmsLoginTest)
  7. 用户名不存在 ... ok
  8. test_login3 (__main__.CmsLoginTest)
  9. 用户名、密码正确 ... ok
  10.  
  11. ----------------------------------------------------------------------
  12. Ran 4 tests in 44.818s
  13.  
  14. OK
  15.  
  16. Process finished with exit code 0

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

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

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

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

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

  1. import unittest
  2. from cmslogin import CmsLoginTest
  3. from smelogin import SmeLoginTest
  4.  
  5. if __name__ == "__main__":
  6. # 构造测试套件
  7. suite = unittest.TestSuite()
  8. test_cases = [CmsLoginTest("test_login1"),CmsLoginTest("test_login2"),CmsLoginTest("test_login4"),
  9. CmsLoginTest("test_login3"),SmeLoginTest("test_login1"),SmeLoginTest("test_login2")]
  10. suite.addTests(test_cases)
  11. # 执行测试
  12. runner = unittest.TextTestRunner(verbosity=2)
  13. runner.run(suite)

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

  1. import unittest
  2. from cmslogin import CmsLoginTest
  3. from smelogin import SmeLoginTest
  4.  
  5. if __name__ == "__main__":
  6. # 构造测试套件
  7. suite = unittest.TestSuite()
  8. # 第一种方法:传入'模块名.TestCase名'
  9. suite.addTests(unittest.TestLoader().loadTestsFromName('cmslogin.CmsLoginTest'))
  10. suite.addTests(unittest.TestLoader().loadTestsFromName('smelogin.SmeLoginTest'))
  11. # 这里还可以把'模块名.TestCase名'放到一个列表中
  12. suite.addTests(unittest.TestLoader().loadTestsFromNames(['cmslogin.CmsLoginTest','smelogin.SmeLoginTest']))
  13. # 第二种方法:传入TestCase
  14. suite.addTests(unittest.TestLoader().loadTestsFromTestCase(CmsLoginTest))
  15. # 执行测试
  16. runner = unittest.TextTestRunner(verbosity=2)
  17. runner.run(suite)

unittest详解(三) 测试套件(TestSuite)的更多相关文章

  1. .NET DLL 保护措施详解(三)最终效果

    针对.NET DLL 保护措施详解所述思路完成最终的实现,以下为程序包下载地址 下载 注意: 运行环境为.net4.0,需要安装VS2015 C++可发行组件包vc_redist.x86.exe.然后 ...

  2. Android 之窗口小部件详解(三)  部分转载

    原文地址:http://blog.csdn.net/iefreer/article/details/4626274. (一) 应用程序窗口小部件App Widgets 应用程序窗口小部件(Widget ...

  3. linux下getsockopt和setsockopt详解及测试

    linux下getsockopt和setsockopt详解及测试 NAME 名字 getsockopt, setsockopt - get and set options on sockets 获取或 ...

  4. unittest详解(四) 批量执行用例(discover)

    前面我们说了,对于不同文件用例,我们可以通过addTest()把用例加载到一个测试套件(TestSuite)来统一执行,对于少量的文件这样做没问题,但是如果有几十上百个用例文件,这样做就太浪费时间了. ...

  5. WebSocket安卓客户端实现详解(三)–服务端主动通知

    WebSocket安卓客户端实现详解(三)–服务端主动通知 本篇依旧是接着上一篇继续扩展,还没看过之前博客的小伙伴,这里附上前几篇地址 WebSocket安卓客户端实现详解(一)–连接建立与重连 We ...

  6. logback -- 配置详解 -- 三 -- <encoder>

    附: logback.xml实例 logback -- 配置详解 -- 一 -- <configuration>及子节点 logback -- 配置详解 -- 二 -- <appen ...

  7. python设计模式之装饰器详解(三)

    python的装饰器使用是python语言一个非常重要的部分,装饰器是程序设计模式中装饰模式的具体化,python提供了特殊的语法糖可以非常方便的实现装饰模式. 系列文章 python设计模式之单例模 ...

  8. Python操作redis字符串(String)详解 (三)

    # -*- coding: utf-8 -*- import redis #这个redis不能用,请根据自己的需要修改 r =redis.Redis(host=") 1.SET 命令用于设置 ...

  9. pika详解(三)SelectConnection及其他Connection

    pika详解(三)SelectConnection及其他Connection   本文链接:https://blog.csdn.net/comprel/article/details/94661147 ...

随机推荐

  1. oracle 插入数据之坑--------oracle字符类型varchar2一个中文占多少字节

    如果你误认为是两个字节,那就大错特错了 Oracle 一个中文汉字 占用几个字节,要根据Oracle中字符集编码决定 查看oracle server端字符集 select userenv('langu ...

  2. 【模板】SPFA(不完全详解)

    一种最短路求法(个人觉得比DIJKSTRA好用) 用于有向图. 大概思路:从根节点开始,枚举每一个点,同时更新他们所联通的点的最短路径,如果路径被更新,则把这个点入队,一直重复这个操作直到队伍为空为止 ...

  3. python_0基础开始_day11

    第十一节 一,函数名的第一类对象 函数名当作值,赋值给变量 print(函数名) 查看看书的内存地址 函数名可以当作容器中的元素 lis = []dic = {}def func():    prin ...

  4. 使用Keras基于AdvancedEAST的场景图像文本检测

    Blog:https://blog.csdn.net/linchuhai/article/details/84677249 GitHub:https://github.com/huoyijie/Adv ...

  5. JSP和JSTL视图解析器

    使用JSTL users.jsp <%@ page language="java" contentType="text/html; charset=UTF-8&qu ...

  6. [转载]C++二维动态数组memset()函数初始化

    来源:https://blog.csdn.net/longhopefor/article/details/20994919 先说说memset函数: void *memset(void *s,int ...

  7. PHP 网站大数据大流量与高并发 笔记

    前端: 1.域名开启cdn 2.大文件使用oss php: 1.模板编译缓存 服务器: 1.负载均衡 数据库: 1.读写分离 待完善

  8. Spring整合Hessian访问远程服务

    声明:该文章转载自Spring整合Hessian访问远程服务,本人搬过来只是为了记录下学习Hessian的过程,忘此博主理解,在此感谢,等本人有能力了再学一些原创的东东,本人实践了下,hessianS ...

  9. 【Groovy】 Groovy笔记

    一.简单了解Groovy Groovy简介: Groovy是基于JVM的敏捷开发语言,语法与Java类似,但更加简洁,容错性也比Java强,同时Java能非常好的契合(例如Groovy能够使用Java ...

  10. Mac破解软件 “XXX”意外退出 奔溃解决方法

     最近很多破解软件提示“XXX”意外退出.这是因为苹果在7月12日删除了TNT的证书,所以大部分TNT破解的Mac软件会出现无法打开,提示意外退出. 目前的解决办法是在终端执行命令: 1.首先安装“A ...