UnitTest使用

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...")
上一篇:接口测试之使用unittest进行接口测试


下一篇:python unittest单元测试框架 测试套件中的addTest