Selenium实战(四)——unittest单元测试2(断言方法+discover()多测试用例的执行)
时间:2020-01-14
本文章向大家介绍Selenium实战(四)——unittest单元测试2(断言方法+discover()多测试用例的执行),主要包括Selenium实战(四)——unittest单元测试2(断言方法+discover()多测试用例的执行)使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
一、断言方法
方法 |
检查 | 版本 |
assertEqual(a,b) | a==b | |
assertNotEqual(a,b) | a!=b | |
assertTrue(x) | bool(x) is True | |
assertFalse(x) | bool(x) is False | |
assertIs(a,b) | a is b | 3.1 |
assertIsNot(a,b) | a is not b | 3.1 |
assertIsNone(x) | x is None | 3.1 |
assertIsNotNone(x) | x is not None | 3.1 |
assertIn(a,b) | a in b | 3.1 |
assertNotIn(a,b) | a not in b | 3.1 |
assertIsInstance(a,b) | isinstance(a,b) | 3.2 |
assertNotIsInstance(a,b) | not isinstance(a,b) | 3.2 |
1 import unittest 2 3 4 class TestAssert(unittest.TestCase): 5 6 def test_equal(self): 7 self.assertEqual(2+2, 4) 8 self.assertEqual("python", "python") 9 self.assertNotEqual("hello", "python") 10 11 def test_in(self): 12 self.assertIn("hello", "hello world") 13 self.assertNotIn("hi", "hello") 14 15 def test_true(self): 16 self.assertTrue(True) 17 self.assertFalse(False) 18 19 20 if __name__ == '__main__': 21 unittest.main()
二、测试用例的组织与discover()方法
要执行多个不同文件下的测试用例,可以使用unittest中的TestLoader类提供的discover()方法查找要用到的测试用例。该类根据各种标准加载测试用例,并将它们返回给测试套件。正常情况下,不需要创建这个类的实例。unittest提供了可以共享的defaultTestLoader类,可以使用其子类或方法创建实例,discover()方法就是其中之一。
discover(start_dir, pattern='test*.py', top_level_dir=None)
找到指定目录及其子目录下的所有测试模块,只有匹配的文件名才能被加载。如果启动的不是顶层目录,那么顶层目录必须单独指定。
- start_dir:待测试的模块名或测试用例目录。
- pattern='test*.py':测试用例文件名的匹配原则。
- top_level_dir=None:测试模块的顶层目录,如果没有顶层目录,则默认为None
一个单元测试的文件目录如下:
两个不相关的判断闰年功能(leap_year.py)和计算器功能(calculator.py)的代码文件分别对应两个测试文件,calculator.py:
1 # 计算器类 2 class Calculator: 3 def __init__(self, a, b): 4 self.a = int(a) 5 self.b = int(b) 6 7 def add(self): 8 return self.a + self.b 9 10 def sub(self): 11 return self.a - self.b 12 13 def mul(self): 14 return self.a * self.b 15 16 def div(self): 17 return self.a / self.b
test_calculator.py文件:
1 import unittest 2 3 4 class TestAssert(unittest.TestCase): 5 6 def test_equal(self): 7 self.assertEqual(2+2, 4) 8 self.assertEqual("python", "python") 9 self.assertNotEqual("hello", "python") 10 11 def test_in(self): 12 self.assertIn("hello", "hello world") 13 self.assertNotIn("hi", "hello") 14 15 def test_true(self): 16 self.assertTrue(True) 17 self.assertFalse(False) 18 19 20 if __name__ == '__main__': 21 unittest.main()
leap_year.py文件:
1 class LeapYear: 2 3 def __init__(self, year): 4 self.year = int(year) 5 6 def answer(self): 7 year = self.year 8 if year % 100 == 0: 9 if year % 400 == 0: 10 # 整百年能被400整除的是闰年 11 return "{0}是闰年".format(year) 12 else: 13 return "{0}不是闰年".format(year) 14 else: 15 if year % 4 == 0: 16 # 非整百年能被4整除的是闰年 17 return "{0}是闰年".format(year) 18 else: 19 return "{0}不是闰年".format(year)
test_leap_year.py文件:
1 import unittest 2 3 from files.unit_test.leap_year import LeapYear 4 5 6 class TestLeapYear(unittest.TestCase): 7 def test_2000(self): 8 ly = LeapYear(2000) 9 self.assertEqual(ly.answer(), "2000是闰年") 10 11 def test_2004(self): 12 ly = LeapYear(2004) 13 self.assertEqual(ly.answer(), "2004是闰年") 14 15 def test_2017(self): 16 ly = LeapYear(2017) 17 self.assertEqual(ly.answer(), "2017不是闰年") 18 19 def test_2100(self): 20 ly = LeapYear(2100) 21 self.assertEqual(ly.answer(), "2100不是闰年") 22 23 24 if __name__ == '__main__': 25 unittest.main()
最后,用一个执行文件对这两个测试文件进行执行run_tests.py文件:
1 import unittest 2 3 # 定义测试用例的目录为当前目录中的unit_test 4 test_dir = './' 5 suits = unittest.defaultTestLoader.discover(test_dir, pattern='test*.py') 6 if __name__ == '__main__': 7 runner = unittest.TextTestRunner() 8 runner.run(suits)
discover()方法会自动根据测试用例目录(unit_test下)查找测试用例文件(test*.py),并将找到的测试用例添加到测试套件中,因此,可以直接通过run()方法执行测试套件suits.这种方式极大地简化了测试用例的查找,我们需要做的是按照文件的匹配规则创建测试文件即可。
原文地址:https://www.cnblogs.com/pegawayatstudying/p/12176611.html
- 我最常用的Intellij IDEA快捷键
- 用Js控制TextBox不能复制粘贴
- 漫画:什么是单例模式?(整合版)
- 保护连接字符串
- IntelliJ IDEA 复杂的重构技巧(二)
- Spring Boot中使用Flyway来管理数据库版本
- 缓存穿透、缓存并发、热点缓存之最佳招式
- 【译】Spring 官方教程:使用 Restdocs 创建 API 文档
- c#中设置快捷键
- 程序员你为什么这么累【续】:编码习惯之工具类规范
- IntelliJ IDEA 复杂的重构技巧
- 打造属于自己的支持版本迭代的Asp.Net Web Api Route
- 分布式消息队列 RocketMQ 源码分析 —— Message 拉取与消费(上)
- 分布式消息队列 RocketMQ 源码分析 —— Message 拉取与消费(下)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Dart判断运算符
- 机器学习之朴素贝叶斯算法原理与代码实现
- jquery中ajax的使用(java)
- mybatis框架org.apache.ibatis.exceptions.PersistenceException:
- Spring源码学习笔记(3)——容器的功能扩展
- Dart数组的常规操作
- 机器学习之logistic回归算法与代码实现原理
- spring整合中application.xml配置
- RocketMQ详解(10)——Consumer详解
- RocketMQ详解(12)——RocketMQ的重试机制
- RocketMQ详解(13)——RocketMQ的消息模式
- 深度学习之卷积神经网络(CNN)详解与代码实现(一)
- Dart自定义类、构造函数
- Dart类中static静态成员及访问
- Dart中..级联操作