1. 基本使用方法
    
    test01.py
    #!usr/bin/python
    # -*- coding: utf-8 -*-
    import unittest  # 1.导入unittest
    
    
    class Test01(unittest.TestCase):  # 2.继承TestCase类
        def setUp(self):  # 预置条件,继承自TestCase
            print "start"
    
        def tearDown(self):  ## 后置条件,继承自TestCase
            print "end"
    
        def test01(self):  ## 自己编写的测试方法,必须以'test*'开头
            print "test01"
    
        def test03(self):
            print "test03"
    
        def test02(self):#每个测试方法都可单独运行,鼠标放在此处是只运行这个测试方法
            print "test02"
    
    
    if __name__ == '__main__':
        unittest.main()#运行上边的所有测试用例,
    
    
    
    main()方法使用TestLoader类来搜索所有包含在该模块中以“test”命名开头的测试方法,并自动执行他们。执行方法的默认顺序是:根据ASCII码的顺序加载测试用例,数字与字母的顺序为:0-9,A-Z,a-z。所以以A开头的测试用例方法会优先执行,以a开头会后执行

     

  2. 测试用例执行顺序
    start
    test01
    end
    start
    test02
    end
    start
    test03
    end
    
    
    每个测试方法执行前执行setUp,执行后执行tearDown,测试方法顺序执行按照测试方法名称排序执行

     

  3. unittest批量执行(discover),即如果有一个包下有test01.py和test02.py两个脚本如何执行?
    test02.py
    #!usr/bin/python
    # -*- coding: utf-8 -*-
    import unittest  # 1.导入unittest
    
    
    class Test02(unittest.TestCase):  # 2.继承TestCase类
        def setUp(self):  # 预置条件,继承自TestCase
            print "start"
    
        def tearDown(self):  ## 后置条件,继承自TestCase
            print "end"
    
        def test01(self):  ## 自己编写的测试方法,必须以'test*'开头
            print "test01"
    
        def test03(self):
            print "test03"
    
        def test02(self):#每个测试方法都可单独运行,鼠标放在此处是只运行这个测试方法
            print "test02"
    
    
    if __name__ == '__main__':
        unittest.main()#运行上边的所有测试用例,
    #!usr/bin/python
    # -*- coding: utf-8 -*-
    import unittest
    import os
    import HTMLTestRunner
    case_path = os.path.join(os.getcwd(),"case")
    report_path=os.path.join(os.getcwd(),"report.html")
    if __name__ == '__main__':
        discover = unittest.defaultTestLoader.discover(start_dir=case_path,pattern="test*.py",top_level_dir=None)
    
        runner = unittest.TextTestRunner()
        runner.run(discover)
    1.discover方法里面有三个参数:
    
    -case_dir:这个是待执行用例的目录。
    
    -pattern:这个是匹配脚本名称的规则,test*.py意思是匹配test开头的所有脚本。
    
    -top_level_dir:这个是顶层目录的名称,一般默认等于None就行了。
    
    2.discover加载到的用例是一个list集合,需要重新写入到一个list对象testcase里,
    这样就可以用unittest里面的TextTestRunner这里类的run方法去执行。
    
    
    discover是一个Testsuite对象,里边是一个包含每个测试脚本的列表
    <unittest.suite.TestSuite tests=[
    <baidu.test_01.Test testMethod=test01>, 
    <baidu.test_01.Test testMethod=test02>, 
    <baidu.test_01.Test testMethod=test03>, 
    <baidu.test_02.Test testMethod=test01>, 
    <bolg.test_04.Test testMethod=test03>]>
    

     

  4. HtmlTestRunner
    import unittest
    import os
    import HTMLTestRunner
    #用例路径
    case_path = os.path.join(os.getcwd(),"case")
    #报告路径
    report_path=os.path.join(os.getcwd(),"report.html")
    if __name__ == '__main__':
        discover = unittest.defaultTestLoader.discover(start_dir=case_path,pattern="test*.py",top_level_dir=None)
        for i, j in zip(discover, range(len(list(discover)))):
            print i,j
        # runner = unittest.TextTestRunner()
        fp = open(report_path,"wb")
        runner =HTMLTestRunner.HTMLTestRunner(stream=fp,title=u"标题",description=u"描述")
        runner.run(discover)
    
    #使用HTMLTestRunner可以把unittest的测试结果从文本形式的转换成为更直观好看的html格式的
    #使用方法1.下载http://tungwaiyip.info/software/HTMLTestRunner.html HTMLTestRunner
    #2.将下载好的py文件放到python下的lib文件夹
    #3.调用HTMLTestRunner.HTMLTestRunner方法生成runner,替代原来的runner = unittest.TextTestRunner()
    #三个参数说明
    # --stream:测试报告写入文件的存储区域
    #
    # --title:测试报告的主题
    #
    # --description:测试报告的描述
    
    可以在测试方法开头写上测试用例描述,将会显示在测试报告中
  5. 用setUp与setUpClass区别

    #!usr/bin/python
    # -*- coding: utf-8 -*-
    import unittest
    
    
    class Test01(unittest.TestCase):
        @classmethod
        def setUpClass(cls): #类方法,仅执行一次
            print 1111111111
    
        @classmethod
        def tearDownClass(cls):
            print 2222222222222
    
        def setUp(self):      #每个测试用例都执行
            print "start11"
    
        def tearDown(self):
            print "end11"
    
        def test01(self):
            print "test01"
    
        def test03(self):
            print "test03"
    
        def test02(self):
            print "test02"
    
    
    if __name__ == '__main__':
        unittest.main()
    

     

  6. 数据驱动ddt

    #!usr/bin/python
    # -*- coding: utf-8 -*-
    import unittest
    import ddt
    values = [{},{}.{}]
    @ddt.ddt
    class Test01(unittest.TestCase):
        def setUp(self):
            print "start"
    
        def tearDown(self):
            print "end"
        @ddt.data(*values)
        def test01(self,data):
            print data
    
        def test03(self):
            print "test03"
    
        def test02(self):
            print "test02"
    
    
    if __name__ == '__main__':
        unittest.main()
    1.测试数据为多个字典的list类型
    
    2.测试类前加修饰@ddt.ddt
    
    3.case前加修饰@ddt.data()
    
    4.运行后用例会自动加载成三个单独的用例

     

  7. 跳过测试

    unittest.skip():装饰器,当运行用例时,有些用例可能不想执行等,
    可用装饰器暂时屏蔽该条测试用例。一种常见的用法就是比如说想调试
    某一个测试用例,想先屏蔽其他用例就可以用装饰器屏蔽。
    
    @unittest.skip(reason): skip(reason)装饰器:无条件跳过装饰的测试,
    并说明跳过测试的原因。
    
    @unittest.skipIf(reason): skipIf(condition,reason)装饰器:
    条件为真时,跳过装饰的测试,并说明跳过测试的原因。
    
    @unittest.skipUnless(reason): skipUnless(condition,reason)装饰器:
    条件为假时,跳过装饰的测试,并说明跳过测试的原因。
    
    @unittest.expectedFailure(): expectedFailure()测试标记为失败。
    
    
    
    
    
    
    
    @unittest.skip('暂时跳过用例3的测试')
    def test_case3(self):
          print self.number
          self.assertEqual(self.number,30,msg='Your input is not 30')

     

  8. unittest中类的说明

    1.unittest.TestSuite():unittest框架的TestSuite()类是用来创建测试套件的。
    将test_baidu模块下的BaiduTest类下的test_baidu测试用例添加到测试套件
    
    suite = unittest.TestSuite()
    suite.addTest(test_baidu.BaiduTest('test_baidu'))
    
    2.unittest.TextTextRunner():unittest框架的TextTextRunner()类,
    通过该类下面的run()方法来运行suite所组装的测试用例,入参为suite测试套件。
    
    runner = unittest.TextTestRunner()
    runner.run(suite)
    
    3.unittest.defaultTestLoader(): defaultTestLoader()类,
    通过该类下面的discover()方法可自动更具测试目录start_dir
    匹配查找测试用例文件(test*.py),并将查找到的测试用例组装到测试套件,
    因此可以直接通过run()方法执行discover。
    
    
    '''
    #8.2执行测试用例方案二如下:
    #8.2.1先构造测试集
    #8.2.1.1实例化测试套件
        suite=unittest.TestSuite()
    #8.2.1.2将测试用例加载到测试套件中。
    #执行顺序是按照加载顺序:先执行test_case2,再执行test_case1
        suite.addTest(Test('test_case2'))
        suite.addTest(Test('test_case1'))
    #8.2.2执行测试用例
    #8.2.2.1实例化TextTestRunner类
        runner=unittest.TextTestRunner()
    #8.2.2.2使用run()方法运行测试套件(即运行测试套件中的所有用例)
        runner.run(suite)
    '''
        
    '''
    #8.3执行测试用例方案三如下:
    #8.3.1构造测试集(简化了方案二中先要创建测试套件然后再依次加载测试用例)
    #执行顺序同方案一:执行顺序是命名顺序:先执行test_case1,再执行test_case2
        test_dir = './'
        discover = unittest.defaultTestLoader.discover(test_dir, pattern='test_*.py')
    #8.3.2执行测试用例
    #8.3.2.1实例化TextTestRunner类
        runner=unittest.TextTestRunner()
    #8.3.2.2使用run()方法运行测试套件(即运行测试套件中的所有用例)
        runner.run(discover)   
    '''

     

  9. BeautifulReport替代HtmlTestRunner

    import unittest
    from BeautifulReport import BeautifulReport
    
    if __name__ == '__main__':
        test_suite = unittest.defaultTestLoader.discover('../tests', pattern='test*.py')
        result = BeautifulReport(test_suite)
        result.report(filename='测试报告', description='测试deafult报告', log_path='report')
    
    
    
        add_test_img ( *pargs )
    
    可以在测试用例上挂载一个装饰器, 实例内容如下
    
    ps:
    
        默认存放的图片路径是img, 需要在当前测试项目的启动路径下, 创建一个img文件夹
        传递给装饰器的图片,在运行测试前可以不存在, 运行测试之后生成即可.
        当文件在报告中展示后, 想要看到原图, 可以点击报告中的缩略图查看完整的截图
    
    import unittest
    from BeautifulReport import BeautifulReport
    
    
    class UnittestCaseSecond(unittest.TestCase):
        """ 测试代码生成与loader 测试数据"""
        
        def test_equal(self):
            """
                test 1==1
            :return:
            """
            import time
            time.sleep(1)
            self.assertTrue(1 == 1)
        
        @BeautifulReport.add_test_img('测试报告.png')
        def test_is_none(self):
            """
                test None object
            :return:
            """
            save_some_img('测试报告.png')
            self.assertIsNone(None)

     

  10. 断言

    方法 检查 版本
    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.1
    assertNotIsInstance(a, b) not isinstance(a,b) 3.1
Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐