zoukankan      html  css  js  c++  java
  • unittest框架学习笔记

    1、unittest全部属性

    ['BaseTestSuite', 'FunctionTestCase', 'SkipTest', 'TestCase', 'TestLoader',
    'TestProgram', 'TestResult', 'TestSuite', 'TextTestResult', 'TextTestRunner',
    '_TextTestResult', '__all__', '__builtins__', '__doc__', '__file__', '__name__',
    '__package__', '__path__', '__unittest', 'case', 'defaultTestLoader',
    'expectedFailure', 'findTestCases', 'getTestCaseNames', 'installHandler', 'loader',
    'main', 'makeSuite', 'registerResult', 'removeHandler', 'removeResult', 'result',
    'runner', 'signals', 'skip', 'skipIf', 'skipUnless', 'suite', 'util']
    

    2、用例基本类:unittest.TestCase

    TestCase类,所有测试用例类继承的基本类。
    
    使用方法:
    
    class BaiduTest(unittest.TestCase):
        pass
    

    2.1、前置条件:setUp()

    • 用于测试用例执行前的初始化工作。
    • 如:连接数据库、初始化浏览器等。
    # 使用方法:
    
        def setUp(self):
            '''这里编写执行用例的前置条件'''
            pass
    

    2.2、后置条件:tearDown()

    • 用于测试用例执行之后的善后工作。
    • 如:关闭数据库、关闭浏览器之内的。
    # 使用方法:
    
        def tearDown(self):
            '''这里编写执行用例的善后工作'''
            pass
    

    2.3、断言:assert*()

    • assert*():一些断言方法:在执行测试用例的过程中,最终用例是否执行通过,是通过判断测试得到的实际结果和预期结果是否相等决定的。
    assertEqual(a,b,[msg='测试失败时打印的信息']):断言a和b是否相等,相等则测试用例通过。
    
    assertNotEqual(a,b,[msg='测试失败时打印的信息']):断言a和b是否相等,不相等则测试用例通过。
    
    assertTrue(x,[msg='测试失败时打印的信息']):断言x是否True,是True则测试用例通过。
    
    assertFalse(x,[msg='测试失败时打印的信息']):断言x是否False,是False则测试用例通过。
    
    assertIs(a,b,[msg='测试失败时打印的信息']):断言a是否是b,是则测试用例通过。
    
    assertNotIs(a,b,[msg='测试失败时打印的信息']):断言a是否是b,不是则测试用例通过。
    
    assertIsNone(x,[msg='测试失败时打印的信息']):断言x是否None,是None则测试用例通过。
    
    assertIsNotNone(x,[msg='测试失败时打印的信息']):断言x是否None,不是None则测试用例通过。
    
    assertIn(a,b,[msg='测试失败时打印的信息']):断言a是否在b中,在b中则测试用例通过。
    
    assertNotIn(a,b,[msg='测试失败时打印的信息']):断言a是否在b中,不在b中则测试用例通过。
    
    assertIsInstance(a,b,[msg='测试失败时打印的信息']):断言a是是b的一个实例,是则测试用例通过。
    
    assertNotIsInstance(a,b,[msg='测试失败时打印的信息']):断言a是是b的一个实例,不是则测试用例通过。
    

    3、单元测试:unittest.main()

    【1】作用:可以运行单个测试用例检查用例是否正确,单元测试。
    
    【2】执行条件:执行的时候会自动搜索模块中以“test”命名开头的测试方法。
    
    【3】执行默认顺序:
    1、根据ASCII码的顺序加载测试用例。
    2、数字与字母的顺序为:0-9,A-Z,a-z。
    3、所以A开头的测试用例方法会优先执行,以a开头会后执行。
    
    【4】使用方法:
    
    import unittest
    
    class Test(unittest.TestCase):
    
        def setUp(self):
            print('start')
    
        def test_01(self):
            print('test_01')
    
        def test_02(self):
            print('test_02')
    
        def tearDown(self):
            print('end')
    
    
    if __name__ == '__main__':
        unittest.main()
    
    # 执行顺序:setUp() -> test_01() -> tearDown() -> setUp() -> test_01() -> tearDown()
    
    #完整流程即 [前置 -> 用例 -> 后置]这样一个循环反复的顺序。
    

    4、用例套件_1:unittest.TestSuite()

    • unittest框架的TestSuite()类是用来创建测试套件的。

    addTest():

    • addTest()方法是将测试用例添加到测试套件中。
    import unittest
    
    class Test(unittest.TestCase):
    
        def test_01(self):
            print('test_01')
    
    
    if __name__ == '__main__':
        suite = unittest.TestSuite()
        suite.addTest(Test('test_01'))
        suite.addTest(Test('test_02'))
        runner = unittest.TextTestRunner()
        runner.run(suite)
    
    

    5、用例套件_2:unittest.defaultTestLoader()

    • unittest框架的defaultTestLoader()类,通过该类下面的discover()方法可根据测试目录匹配查找测试用例文件(test*.py),并将查找到的测试用例组装到测试套件,因此可以直接通过run()方法执行discover。用法如下:
    ···
    ····
    ·····
    
    if __name__ == '__main__':
        case_path =os.path.join(os.getcwd(),'case')
        discover = unittest.defaultTestLoader.discover(case_path, pattern='test_*.py')
        runner = unittest.TextTestRunner()
        runner.run(discover)
        
    #case_path是存放测试用例的地方
    
    

    备注:discover方法里面有三个参数

    -case_dir:这个是待执行用例的目录。

    -pattern:这个是匹配脚本名称的规则,test*.py意思是匹配test开头的所有脚本。

    -top_level_dir:这个是顶层目录的名称,一般默认等于None就行了。

    6、执行套件:unittest.TextTextRunner()

    • unittest框架的TextTextRunner()类,配合TestSuite()、defaultTestLoader()类一起使用,通过TextTextRunner类下面的run()方法来运行套件所组装的测试用例,入参为suite测试套件。
    import unittest
    
    class Test(unittest.TestCase):
    
        def setUp(self):
            print('start')
    
        def test_01(self):
            print('test_01')
    
        def test_02(self):
            print('test_02')
    
        def tearDown(self):
            print('end')
    
    
    if __name__ == '__main__':
        suite = unittest.TestSuite()
        suite.addTest(Test('test_01'))
        suite.addTest(Test('test_02'))
        runner = unittest.TextTestRunner()
        runner.run(suite)
    
    

    7、装饰器:unittest.skip()

    • unittest.skip():装饰器,当运行用例时,有些用例可能不想执行等,可用装饰器暂时屏蔽该条测试用例。
    @unittest.skip(reason): skip(reason)装饰器:无条件跳过装饰的测试,并说明跳过测试的原因。
    
    @unittest.skipIf(reason): skipIf(condition,reason)装饰器:条件为真时,跳过装饰的测试,并说明跳过测试的原因。
    
    @unittest.skipUnless(reason): skipUnless(condition,reason)装饰器:条件为假时,跳过装饰的测试,并说明跳过测试的原因。
    
    @unittest.expectedFailure(): expectedFailure()测试标记为失败。
    

    8、装饰器:@classmethod

    • 作用:在某些特定情况下,避免每次执行用例时候都会执行一次unittest里面setUp()。
    • 比如进行登陆、打开浏览器、连接数据库等操作的时候。
    #使用方法:
    import unittest
    
    class Test(unittest.TestCase):
    
        @classmethod
        def setUpClass(cls):    #注意这里传入的参数不是self,而是指定参数cls
            print('start')
    
        @classmethod
        def test_01(self):
            print('test_01')
    
        @classmethod
        def test_02(self):
            print('test_02')
    
        @classmethod
        def tearDownClass(cls):     #注意这里传入的参数不是self,而是指定参数cls
            print('end')
    
    
    if __name__ == '__main__':
        unittest.main()
    
    #运行结果:
    # start
    # test_01
    # test_02
    # end
    

    9、数据驱动:ddt

    【1】作用:

    • 针对某些功能相同,但是输入的参数数据不同时,可以使用数据驱动设计的模式,一组数据对应一个测试用例,用例自动加载生成,有效的较少代码量。如:登录时。

    【2】安装ddt模块

    pip install ddt
    

    【3】ddt模块使用方法

    1. 测试数据为存放多个字典的列表。
    2. 测试类的前面需要加上修饰器:@ddt.ddt
    3. 对应测试用例之前加上修饰器:@ddt.data()
    import unittest
    import ddt
    
    #   测试数据:每一条数据都是一个字典;全部数据存放在一个列表中。
    testDate = [{'username': 'AAA', 'password': '11111'},
                {'username': 'BBB', 'password': '22222'},
                {'username': 'CCC', 'password': '33333'}]
    
    #测试类之前需要加上装饰器:@ddt.ddt
    @ddt.ddt
    class Test(unittest.TestCase):
    
        def setUp(self):
            print('start')
    
        #测试用例前面需要加上装饰器:@ddt.data()
        #装饰器的参数就是测试数据:@ddt.data(*testDate)
        @ddt.data(*testDate)
        def test_ddt(self, data):
            print(data)
    
        def tearDown(self):
            print('end')
    
    
    if __name__ == '__main__':
        unittest.main()
    
    //////////////////////////////////////////////
    
    #输出结果:
    
    start
    {'username': 'AAA', 'password': '11111'}
    end
    start
    {'username': 'BBB', 'password': '22222'}
    end
    start
    {'username': 'CCC', 'password': '33333'}
    end
    

    10、生成测试报告:HTMLTestRunner

    【1】安装HTMLTestRunner

    • 1.HTMLTestRunner这个模块下载不能通过pip安装了,只能下载后手动导入,下载地址:http://tungwaiyip.info/software/HTMLTestRunner.html

    • 2.Download下HTMLTestRunner.py文件就是我们需要下载的包。

    • 3.下载后手动拖到python安装文件的Lib目录下

    【2】使用方法:

    ····
    ·····
    
    if __name__ == '__main__':
        #将测试用例加入到套件中
        suite = unittest.TestSuite()
        suite.addTest(Test('test_01'))
        suite.addTest(Test('test_02'))
        # 获取当前时间,这样便于下面的使用。
        now = time.strftime("%Y-%m-%M-%H_%M_%S", time.localtime(time.time())) + '.html'
        # filePath:测试报告保存的路径
        filePath = os.path.join(os.getcwd(), 'report', now)
        fp = open(filePath, 'wb')
        # 测试报告的title、描述
        runner = HTMLTestRunner.HTMLTestRunner(stream=fp,
                                               title='自动化测试HTML文件标题',
                                               description='自动化测试HTML文件描述')
        runner.run(suite)
        # 最后记着关闭文件
        fp.close()
    

    11、截图

    在测试过程中,用的最多的就是截图功能,毕竟有图有真相嘛,截图不仅可以把缺陷原原本本的记录下来,也方便后面我们根据缺陷。

    webdriver中提供的截图方法一:

    • get_screenshot_as_file(filename)
    • 这个方法是获取当前window的截图,出现IOError时候返回False,截图成功返回True。
    • filename参数是保存文件的路径。
    import os
    import time
    import unittest
    
    from selenium import webdriver
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.support.wait import WebDriverWait
    
    
    class Test(unittest.TestCase):
    
        def setUp(self):
            '''初始化浏览器、打开网址、并等待页面加载完'''
            self.driver = webdriver.Chrome()
            self.driver.get('https://www.baidu.com/')
            self.wait = WebDriverWait(self.driver, 10)
            self.wait.until(EC.presence_of_all_elements_located)
    
        def test_get_screenshot(self):
            '''获取当前时间,用于后面创建图片名'''
            now = '百度' + time.strftime("%Y-%m-%M-%H_%M_%S", time.localtime(time.time())) + '.jpg'
            filePath = os.path.join(os.getcwd(), 'image', now)
            # get_screenshot_as_file()的参数就是图片保存路径
            self.driver.get_screenshot_as_file(filePath)
    
        def tearDown(self):
            self.driver.quit()
    
    
    if __name__ == '__main__':
        unittest.main()
    
    

    方法二:

    • get_screenshot_as_base64()
    • 这个方法也是获取屏幕截图,保存的是base64的编码格式,在HTML界面输出截图的时候,会用到。

    方法三:

    • get_screenshot_as_png()
    • 这个是获取屏幕截图,保存的是二进制数据。
  • 相关阅读:
    「beta不只是为了测试」​​​​​​​​​​​​​​​​​​写出我心(一百八十八)​
    「多尝试换一种思路」​​​​​​​​​​​​​​​​​​写出我心(一百八十七)
    「先给事情排个优先级」​​​​​​​​​​​​​​​​​​写出我心(一百八十六)
    「为达目标,不折手段」​​​​​​​​​​​​​​​​​写出我心(一百八十五)
    「迈出第一步」​​​​​​​​​​​​​​​​写出我心(一百八十四)
    「认真思考,果断提问」​​​​​​​​​​​​​​​写出我心(一百八十三)
    「提高阅读速度的4个步骤」​​​​​​​​​​​​​​写出我心(一百八十二)
    「一行精华」​​​​​​​​​​​​​写出我心(一百八十一)
    「阅读的量要大于质」写出我心(一百八十)
    Programming Concepts: Static vs. Dynamic Type Checking
  • 原文地址:https://www.cnblogs.com/jasontang369/p/9568979.html
Copyright © 2011-2022 走看看