UnitTest使用
import unittest
/*
UnitTest
UnitTest 核心要素
1. TestCase
2. TestSuite
3. TestRunner
4. TestLoader
5. Fixture
*/
/*
-------------------------------------------------------------------------------
一、TestCase
1. 导包:import unittest
2. 定义测试类:新建测试类必须继承unittest.TestCase
3. 定义测试方法:测试方法名称命名必须以test开头
*/
def add(a, b):
return a + b
class testdemo(unittest.TestCase):
def test_01(self):
result = add(3, 5)
print('result:', result)
def test_02(self):
result = add(5, 5)
print('result:', result)
/*
-------------------------------------------------------------------------------
二、TestSuite 以及 TextTestRunner
1. 导包:import unittest
2. 定义测试类:新建测试类必须继承unittest.TestCase
3. 定义测试方法:测试方法名称命名必须以test开头
1. 实例化: suite = unittest.TestSuite()
(suite:为TestSuite实例化的名称)
2. 添加用例:suite.addTest(ClassName("MethodName"))
(ClassName:为类名;MethodName:为方法名)
3. 添加扩展:suite.addTest(unittest.makeSuite(ClassName))
(搜索指定ClassName内test开头的方法并添加到测试套件中)
*/
from software_ce_shi.case.test01 import Test_01
from software_ce_shi.case.test02 import Test_02
sunit = unittest.TestSuite()
sunit.addTest(Test_01('test_1'))
sunit.addTest(Test_01('test_2'))
sunit.addTest(Test_02('test_1'))
sunit.addTest(Test_02('test_2'))
// sunit.addTest(unittest.makeSunit(Test_01))
// sunit.addTest(unittest.makeSunit(Test_02))
// 执行
unittest.TextTestRunner().run(sunit)
/*
-------------------------------------------------------------------------------
三、TestLoader
说明:
用来加载TestCase到TestSuite中,即加载满足条件的测试用例,并把测试用例封装成测试套件。
使用unittest.TestLoader,通过该类下面的discover()方法自动搜索指定目录下指定开头的.py文件,并将查找到的测试用例组装到测试套件;
用法:
suite = unittest.TestLoader().discover(test_dir, pattern='test*.py')
自动搜索指定目录下指定开头的.py文件,并将查找到的测试用例组装到测试套件
test_dir: 为指定的测试用例的目录
pattern:为查找的.py文件的格式,默认为'test*.py'
也可以使用unittest.defaultTestLoader 代替 unittest.TestLoader()
运行:
runner = unittest.TextTestRunner()
runner.run(suite)
*/
sunit = unittest.TestLoader().discover('../case')
// 或者
// sunit = unittest.defaultTestLoader.discover('../case') # , pattern="t*.py"正则表达式
unittest.TextTestRunner().run(sunit)
/*
1. TestSuite需要手动添加测试用例(可以添加测试类,也可以添加测试类中某个测试方法)
2. TestLoader搜索指定目录下指定开头.py文件,并添加测试类中的所有的测试方法,不能指定添加测试方法;
*/
/*
-------------------------------------------------------------------------------
四、Fixture
Fixture控制级别:
1. 方法级别
2. 类级别
3. 模块级别
1.方法级
1. 初始化(前置处理):
def setUp(self) --> 首先自动执行
2. 销毁(后置处理):
def tearDown(self) --> 最后自动执行
3. 运行于测试方法的始末,即:运行一次测试方法就会运行一次setUp和tearDown
(每个方法前后都会执行)
2.类级别
1. 初始化(前置处理):
@classmethod
def setUpClass(cls): --> 首先自动执行
2. 销毁(后置处理):
@classmethod
def tearDownClass(cls): --> 最后自动执行
3. 运行于测试类的始末,即:每个测试类只会运行一次setUpClass和tearDownClass
(每个类前后执行一次)
3.模块级别
1. 初始化(前置处理):
def setUpModule() --> 首先自动执行
2. 销毁(后置处理):
def tearDownModule() --> 最后自动执行
3. 运行于整个模块的始末,即:整个模块只会运行一次setUpModule和tearDownModule
(每个模块前后执行一次)
总结:
setUp:一般做初始化工作,比如:实例化浏览器驱动对象、浏览器最大化、设置隐式等待等
tearDown:一般做结束工作,比如:关闭浏览器驱动对象、退出登录等
*/
import unittest
def setUpModule():
print('setUpModule is is done........')
def tearDownModule():
print('tearDownModule is is done........')
class TestLogin(unittest.TestCase):
@classmethod
def setUpClass(cls):
print('setUpClass is done ...')
@classmethod
def tearDownClass(cls):
print('tearDownClass is done ...')
def setUp(self):
print("set is done...")
def tearDown(self):
print("tearDown is done...")
def test01(self):
print("test01 is done...")
def test02(self):
print("test02 is done...")
class TestLogin222(unittest.TestCase):
@classmethod
def setUpClass(cls):
print('setUpClass is done ...')
@classmethod
def tearDownClass(cls):
print('tearDownClass is done ...')
def setUp(self):
print("set is done...")
def tearDown(self):
print("tearDown is done...")
def test01(self):
print("test01 is done...")
def test02(self):
print("test02 is done...")
/*
-------------------------------------------------------------------------------
五、UnitTest断言
assertTrue(expr, msg=None)
assertFalse(expr, msg=None)
assertEqual(expected, actual, msg=None)
assertNotEqual(first, second, msg=None)
assertIsNone(obj, msg=None) 验证obj是None,不是则fail
assertIsNotNone(obj, msg=None) 验证obj不是None,是则fail
assertIn(member, container, msg=None) 验证是否member in container【掌握】
assertNotIn(member, container, msg=None)
*/
class TestAssert(unittest.TestCase):
def test01(self):
self.assertTrue(True)
# self.assertTrue(False)
self.assertFalse(False)
# self.assertFalse(True)
self.assertEqual('123', '123')
/*
-------------------------------------------------------------------------------
六、跳过
直接将测试函数标记成跳过
@unittest.skip('代码未完成')
根据条件判断测试函数是否跳过
@unittest.skipIf(condition, reason)
*/
version = 1
def login():
return '登录失败'
class Test_demo(unittest.TestCase):
# @unittest.skipIf(login() == '登录失败', "登录失败,跳过test01方法")
def test01(self):
print("test01 is done...")
self.assertEqual(3, 3)
@unittest.skipIf(version < 2, "版本不够,跳过test02方法")
def test02(self):
print("test02 is done...")
@unittest.skip("跳过test03方法")
def test03(self):
print("test02 is done...")