zoukankan      html  css  js  c++  java
  • python+unittets框架

    本文来源于:https://www.cnblogs.com/insane-Mr-Li/p/9132406.html

    我们整个自动化才是报告的环节基本上分为三个部分:

    1.测试用例的准备

    2.测试用例的执行

    3.测试报告的输出

    1.测试用例的准备:

    那我们就以搜孤网页做一个简单的用例:

    复制代码
    from selenium import webdriver
    import unittest
    class Case_1(unittest.TestCase):
        def setUp(self):
            self.driver = webdriver.Chrome()
            self.driver.maximize_window()#放大浏览器
            self.driver.get("https://www.sogou.com/")
        def test_001(self):
            self.driver.find_element_by_link_text('微信').click()
            self.assertIn(self.driver.title,u'搜狗微信搜索_订阅号及文章内容独家收录,一搜即达')
        def test_002(self):
            self.driver.find_element_by_link_text('新闻').click()
            self.assertIn(self.driver.title,u'搜狗新闻 - 上网从搜狗开始')
        def test_003(self):
            self.driver.find_element_by_link_text('图片').click()
            self.assertIn(self.driver.title,u'搜狗图片-上网从搜狗开始')
        def tearDown(self):
            self.driver.close()
            self.driver.quit()
    if __name__ == '__main__':
        unittest.main()
        print('简单的用例')
    复制代码

    2-3.用例执行与测试报告的输出:

    复制代码
    import os,time,unittest
    import HTMLTestRunner
    
    report_path = os.getcwd()#'F:PythonInterface_automation'
    now = time.strftime('%y-%m-%d %H:%M',time.localtime(time.time()))#获取当前信息并且以前面的格式输出
    title = u'搜狗首页链接测试报告'#标题
    report_repash = os.path.join(report_path,title + now + '.html')#这里只要是组成一个测试报告路径
    print(report_repash)
    
    #导入用例
    def case_all():
        case_pash = 'F:PythonInterface_automation'
        discover = unittest.defaultTestLoader.discover(case_pash,pattern='ceshi*.py')#添加用例,在case_path的路径下,所有以ceshi开头的文件都当做用例文件执行
        return discover
    
    if __name__ == '__main__':
        fp = open(report_repash, "wb") # 保存报告文件
        print(fp)
        runner = HTMLTestRunner.HTMLTestRunner(stream=fp,
                                               title=title + ':',)
        runner.run(case_all()) # 执行用例
        fp.close()
    '''二、unittest.defaultTestLoader.discover加载测试用例
    
    1.discover方法里面有三个参数:
    
    -case_dir:这个是待执行用例的目录。
    
    -pattern:这个是匹配脚本名称的规则,test*.py意思是匹配test开头的所有脚本。
    
    -top_level_dir:这个是顶层目录的名称,一般默认等于None就行了。
    
    2.discover加载到的用例是一个list集合,需要重新写入到一个list对象testcase里,这样就可以用unittest里面的TextTestRunner这里类的run方法去执行。'''
    复制代码

    这就是一个完整的测试用例的产生-执行-结果输出的一个过程其中测试用例的执行有三种办法:

    如下:

    复制代码
    # coding=utf-8
    #1.先设置编码,utf-8可支持中英文,如上,一般放在第一行
    
    #2.注释:包括记录创建时间,创建人,项目名称。
    '''
    Created on 2016-7-27
    @author: Jennifer
    Project:使用unittest框架编写测试用例思路
    '''
    #3.导入unittest模块
    import unittest
    
    #4.定义测试类,父类为unittest.TestCase。
    #可继承unittest.TestCase的方法,如setUp和tearDown方法,不过此方法可以在子类重写,覆盖父类方法。
    #可继承unittest.TestCase的各种断言方法。
    class Test(unittest.TestCase):
    
    #5.定义setUp()方法用于测试用例执行前的初始化工作。
    #注意,所有类中方法的入参为self,定义方法的变量也要“self.变量”
    #注意,输入的值为字符型的需要转为int型
        def setUp(self):
            self.number=raw_input('Enter a number:')
            self.number=int(self.number)
    
    #6.定义测试用例,以“test_”开头命名的方法
    #注意,方法的入参为self
    #可使用unittest.TestCase类下面的各种断言方法用于对测试结果的判断
    #可定义多个测试用例
    #最重要的就是该部分
        def test_case1(self):
            print(self.number)
            self.assertEqual(self.number,10,msg='Your input is not 10')
    
        def test_case2(self):
            print(self.number)
            self.assertEqual(self.number,20,msg='Your input is not 20')
    
        @unittest.skip('暂时跳过用例3的测试')
        def test_case3(self):
            print (self.number)
            self.assertEqual(self.number,30,msg='Your input is not 30')
    
    #7.定义tearDown()方法用于测试用例执行之后的善后工作。
    #注意,方法的入参为self
        def tearDown(self):
            print ('Test over')
    
    #8如果直接运行该文件(__name__值为__main__),则执行以下语句,常用于测试脚本是否能够正常运行
    if __name__=='__main__':
    #8.1执行测试用例方案一如下:
    #unittest.main()方法会搜索该模块下所有以test开头的测试用例方法,并自动执行它们。
    #执行顺序是命名顺序:先执行test_case1,再执行test_case2
        unittest.main()
    
    '''
    #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)
    '''

    unittest基本原理:

      ♦整个平台的搭建使用的是python的unittest测试框架,这里简单介绍下unittest模块的简单应用。

      ♦unittest是python的标准测试库,相比于其他测试框架是python目前使用最广的测试框架。

      ♦unittest有四个比较重要的概念是test fixture, test case, test suite, test runner, 。

        ♦test fixture:The test fixture is everything we need to have in place to exercise the sut。简单来说就是做一些测试过程中需要准备的东西,比如创建临时的数据库,文件和目录等,其中 setUp() 和 setDown() 是最常用的方法

        ♦test case:用户自定义的测试case的基类,调用run()方法,会依次调用setUP方法、执行用例的方法、tearDown()方法。

        ♦test suite:测试用例集合,可以通过addTest()方法手动增加Test Case,也可通过TestLoader自动添加Test Case,TestLoader在添加用例时,会没有顺序。

        ♦test runner:运行测试用例的驱动类,可以执行TestCase,也可执行TestSuite。执行后TestCase和Testsuite会自动管理TestResult。

    其他的unitest的属性:

        ♦unittest.skip():装饰器,当运行用例时,有些用例可能不想执行等,可用装饰器暂时屏蔽该条测试用例。一种常见的用法就是比如说想调试某一个测试用例,想先屏蔽其他用例就可以用装饰器屏蔽。

          @unittest.skip(reason): skip(reason)装饰器:无条件跳过装饰的测试,并说明跳过测试的原因。

          @unittest.skipIf(reason): skipIf(condition,reason)装饰器:条件为真时,跳过装饰的测试,并说明跳过测试的原因。

          @unittest.skipUnless(reason): skipUnless(condition,reason)装饰器:条件为假时,跳过装饰的测试,并说明跳过测试的原因。

          @unittest.expectedFailure(): expectedFailure()测试标记为失败。

    2.TestCase类的属性如下:

      ♦setUp():setUp()方法用于测试用例执行前的初始化工作。如测试用例中需要访问数据库,可以在setUp中建立数据库连接并进行初始化。如测试用例需要登录web,可以先实例化浏览器。

      ♦tearDown():tearDown()方法用于测试用例执行之后的善后工作。如关闭数据库连接。关闭浏览器。

      ♦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的一个实例,不是则测试用例通过。

    通过dir(unittest),我们可以看到unittest全部的属性和方法,他们的关系如下图所示。

     
    unittest主要类关系:

      ♦正常调用unittest的流程是,TestLoader 自动将测试用例TestCase中加载到TestSuite里,TextTestRunner调用TestSuite的run方法,顺序执行里面的TestCase中以test开头的方法,并得到测试结果TestResult。在执行TestCase过程中,先进行SetUp()环境准备,执行测试代码,最后tearDown()进行测试的还原。

      ♦其中TestLoader在加载过程中,进行添加的TestCase是没有顺序的。一个TestCase里如果存在多个验证方法的话,会按照方法中test后方首字母的排序进行执行。

    可以通过手动调用TestSuite的addTest、addTests方法来动态添加TestCase,这样既可以确定添加用例的执行顺序,也可避免TestCase中的验证方法一定要用test开头。

      ♦在搭建接口测试平台的时候,每新建一个接口的时,会自动生成一个 TestCase,选中运行单个接口时,使用TextTestRunner直接调用单个TestCase。运行多个接口时,手动给TestSuite添加TestCase,供TextTestRunner调用并生成测试结果。

    一套整体的流程如下:

    3.TestSuite类的属性如下:(组织用例时需要用到):

      ♦addTest(): addTest()方法是将测试用例添加到测试套件中,如下方,是将test_baidu模块下的BaiduTest类下的test_baidu测试用例添加到测试套件。

    suite = unittest.TestSuite()
    suite.addTest(test_baidu.BaiduTest('test_baidu'))

    4.TextTextRunner的属性如下:(组织用例时需要用到):

      ♦run(): run()方法是运行测试套件的测试用例,入参为suite测试套件。

    runner = unittest.TextTestRunner()
    runner.run(suite)

    5.unitest的目录结构一般如下:重要

  • 相关阅读:
    oracle 10g 免安装客户端在windows下配置
    sql2005 sa密码
    使用windows live writer 有感
    windows xp SNMP安装包提取
    汉化groove2007
    迁移SQL server 2005 Reporting Services到SQL server 2008 Reporting Services全程截图操作指南
    foxmail 6在使用中的问题
    AGPM客户端连接不上服务器解决一例
    SpringSource Tool Suite add CloudFoundry service
    Java 之 SWing
  • 原文地址:https://www.cnblogs.com/yangguanghuayu/p/11777506.html
Copyright © 2011-2022 走看看