zoukankan      html  css  js  c++  java
  • python+unittest框架第一天unittest之简单认识Test Fixure:测试固件【8月17更新】

    20万的慢慢会实现的吧,hhh

    unittest框架,我就不在介绍了,百度有很详细的介绍。

    我们只要了解:

    1、unittest是单元测试框架

    2、它提供用例组织与执行:在实际工作中案例可能有上百条,我们就需要进行用例的组织以及规范,增强代码的可维护性等

    3、它提供丰富的比较方法:相等不相等,包含不包含,TrueFalse的断言方法等等

    4、提供丰富的日志:例如,总执行时间、失败用例数、成功用例数等

    这就是别人造好的车,我们直接开。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

    unittest组成部分:

    TestCase:测试用例,测试用例里面会有很多测试方法,是单元测试中最小维度的测试行为

    Test Fixure:测试固件,测试固件是执行测试时的准备工作和收尾工作(打开和关闭浏览器,链接和关闭数据库等等)

    TestSuite:测试套件,是测试用例的集合

    TestRunner:测试运行器,运行测试用例

    TestReport:将测试结果呈现给用户,生成测试报告

    接下来我们一点一点的学习,上面是大概整体的了

    TestCase类中定义的方法:
    setUp():       ------>       该方法:进行测试前的初始化工作   
    tearDown():    ------>       该方法:进行执行测试后的清除工作(比如关闭浏览器)

    我们看下代码:

     1 import  unittest        #导入unittest框架
     2 
     3 class register(unittest.TestCase):   #定义一个register类,并且继承unittest中的TestCase类
     4 
     5     def setUp(self):                 #TestCase类中定义的方法,setUp()进行测试前的初始化工作,所以它总是第一个执行
     6         print('我已经做好了准备工作')
     7 
     8     def tearDown(self):              #TestCase类中定义的方法,tearDown()进行执行测试后的清除工作,所以它总是案例执行后最后执行
     9         print('已处理')
    10 
    11     def test_001(self):             #第一个测试案例
    12         print('案例_001')
    13 
    14     def test_002(self):            #第二个测试案例
    15         print('案例_002')
    16 
    17 if __name__ == '__main__':
    18         unittest.main(verbosity=2)   ##单元测试运行需要unittest.main(),作用是将一个单元测试模块变成可以直接运行的测试脚本
    verbosity是有三个值,每个值表示的测试结果信息不一样。
    0 (静默模式): 你只能获得总的测试用例数和总的结果 比如 总共100个 失败20 成功80
    1 (默认模式): 非常类似静默模式 只是在每个成功的用例前面有个“.” 每个失败的用例前面有个 “F”
    2 (详细模式):测试结果会显示每个测试用例的所有相关的信息

    我们看下运行后的setup 和 tearDown两个方法的执行顺序:

    我相信你已经理解我的笔记意思,接下来我们继续:
    看下setup()和tearDown()方法与setupclass()和tearDownclass()方法的区别:
    TestCase类中定义的方法:
    setUp(): 该方法:进行测试前的初始化工作,每条案例都会执行一遍
    tearDown(): 该方法:进行执行测试后的清除工作(比如关闭浏览器),每条案例都会执行一遍

    敲黑板!!!注意加class后两个方法的区别:

    setUpClass() 该方法:进行测试前的初始化工作,与setUp()是有区别的,不会每个案例都执行一遍,只会在第一个案例开始前执行一次
    tearDownClass() 该方法:进行测试前的初始化工作,与tearDown()是有区别的,不会每个案例都执行一遍,只会在最后一个案例结束后执行一次
    '''
    我们看下 setupclass()和 tearDownclass()方法在下面小案例中发生了什么:
     1 import unittest                     #导入unittest
     2 import time as t                    #导入time  设置别名 t
     3 from selenium import webdriver      #导入selenium中的webdriver
     4 
     5 class page_baidu(unittest.TestCase):       #定义一个类,并继承unittest.TestCase类
     6 
     7     @classmethod                           #使用 @classmethod  装饰器函数,把方法变成类方法,可以直接调用方法,不需要实例化类对象就可以调用方法
     8     def setUpClass(cls):                   ##  setUpClass()  该方法:进行测试前的初始化工作,与setUp()是有区别的,不会每个案例都执行一遍,
     9         cls.driver = webdriver.Chrome()    #实例化webdriver()对象
    10         cls.driver.maximize_window()      #打开浏览器最大化
    11         cls.driver.implicitly_wait(15)   #隐性等待时间设置15秒,比如页面加载打不开,我们最多等待15秒,适用于全局
    12         cls.driver.get(r'http://www.baidu.com')   #打开百度地址
    13         t.sleep(2)                 #设置强制等待2秒,就是必须等待,用导入的time中的sleep方法,不是全局性,哪里需要设置到哪里,局部的
    14     @classmethod
    15     def tearDownClass(cls):        #最后执行的工作
    16         cls.driver.quit()           #设置关闭浏览器
    17 
    18     def test_baidu_news(self):     #案例一
    19         self.driver.find_element_by_link_text('新闻').click()    #点击百度页面,超链接【新闻】两个字
    20         t.sleep(2)     #设置强制等待2秒,就是必须等待,用导入的time中的sleep方法,不是全局性,哪里需要设置到哪里,局部的
    21 
    22     def test_baidu_map(self):      #  因为第一条案例执行后,setUpClass()方法没有在第二条案例开始的时候进行初始化,所以导致没有回到百度首页,所以选择text文本找不到‘新闻’两个字的超链接,导致有异常出现。
    23         self.driver.find_element_by_link_text('地图').click()
    24         t.sleep(2)
    25 if __name__ =='__main__':
    26     unittest.main(verbosity=2)    #单元测试运行需要unittest.main(),作用是将一个单元测试模块变成可以直接运行的测试脚本

    我们看下执行后的结果:

    如果仔细看了我的笔记,或者你运行了代码,那么你应该知道为啥失败了吧~~~如果不知道,欢迎留言,一起学习

    接下来我们看下setUp() 和 tearDown() 方法:

     1 import unittest                     #导入unittest
     2 import time as t                    #导入time  设置别名 t
     3 from selenium import webdriver      #导入selenium中的webdriver
     4 
     5 class page_baidu(unittest.TestCase):       #定义一个类,并继承unittest.TestCase类
     6 
     7     @classmethod                           #使用 @classmethod  装饰器函数,把方法变成类方法,可以直接调用方法,不需要实例化类对象就可以调用方法
     8     def setUp(cls):                   ##  setUpClass()  该方法:进行测试前的初始化工作,每条案例开始前都会进行一次
     9         cls.driver = webdriver.Chrome()    #实例化webdriver()对象
    10         cls.driver.maximize_window()      #打开浏览器最大化
    11         cls.driver.implicitly_wait(15)   #隐性等待时间设置15秒,比如页面加载打不开,我们最多等待15秒,适用于全局
    12         cls.driver.get(r'http://www.baidu.com')   #打开百度地址
    13         t.sleep(2)                 #设置强制等待2秒,就是必须等待,用导入的time中的sleep方法,不是全局性,哪里需要设置到哪里,局部的
    14     @classmethod
    15     def tearDown(cls):        #最后执行的工作,每条案例开始前都会进行一次
    16         cls.driver.quit()           #设置关闭浏览器
    17 
    18     def test_baidu_news(self):     #案例一
    19         self.driver.find_element_by_link_text('新闻').click()    #点击百度页面,超链接【新闻】两个字
    20         t.sleep(2)     #设置强制等待2秒,就是必须等待,用导入的time中的sleep方法,不是全局性,哪里需要设置到哪里,局部的
    21 
    22     def test_baidu_map(self):      #  因为第一条案例执行后,setUp()方法在第二条案例开始的时候,先进行初始化,所以可以在百度首页,找到‘新闻’两个字的超链接。
    23         self.driver.find_element_by_link_text('地图').click()
    24         t.sleep(2)
    25 if __name__ =='__main__':
    26     unittest.main(verbosity=2)    #单元测试运行需要unittest.main(),作用是将一个单元测试模块变成可以直接运行的测试脚本

    为什么setUp() 和 tearDown() 方法可以将两条案例都执行通过,我想你们应该明白了!!

     那么仔细的你会发现案例中的两个案例是这样的;

    1     def test_baidu_news(self):     #案例一
    2         self.driver.find_element_by_link_text('新闻').click()    #点击百度页面,超链接【新闻】两个字
    3         t.sleep(2)     #设置强制等待2秒,就是必须等待,用导入的time中的sleep方法,不是全局性,哪里需要设置到哪里,局部的
    4 
    5     def test_baidu_map(self):      #  因为第一条案例执行后,setUp()方法在第二条案例开始的时候,先进行初始化,所以可以在百度首页,找到‘新闻’两个字的超链接。
    6         self.driver.find_element_by_link_text('地图').click()
    7         t.sleep(2)

    执行结果是这样滴:

    不要慌,看笔记:

    test_baidu_map ()
    test_baidu_news()

    之所以先执行是,因为会对名字进行比较,两条案例名字的前半部分都是一样的,但是到m和n的时候就不一样了,在ASCLL码中将m和n分别转换为数字后:

    函数: ord()    它以一个字符(长度为1的字符串)作为参数,返回对应的 ASCII 数值.看清楚哦,是一个字符,不要输入多个哦。

    1 print('m转换为ASCLL码是数字: ',ord('m'))
    2 
    3 print('n转换为ASCLL码是数字: ',ord('n'))
    4 
    5 print('我们发现m=109,n=110,所以执行的顺序是先执行109')

    什么是ASCII码:自己百度哦,下面附上百度找到的常见的对照,还有哦,小写字母和大写字母的数字是不一样的!!看下面的图吧,如果不理解留言哦

     在我们知道了unittest框架执行的顺序规则后,我们可以直接用数字,让案例从我们要求的顺序开始执行。

    注意:执行顺序是按照数字从小到大执行。

     1 import unittest                     #导入unittest
     2 import time as t                    #导入time  设置别名 t
     3 from selenium import webdriver      #导入selenium中的webdriver
     4 
     5 class page_baidu(unittest.TestCase):       #定义一个类,并继承unittest.TestCase类
     6 
     7     @classmethod                           #使用 @classmethod  装饰器函数,把方法变成类方法,可以直接调用方法,不需要实例化类对象就可以调用方法
     8     def setUp(cls):
     9         cls.driver = webdriver.Chrome()
    10         cls.driver.maximize_window()
    11         cls.driver.implicitly_wait(15)
    12         cls.driver.get(r'http://www.baidu.com')
    13         t.sleep(2)
    14     @classmethod
    15     def tearDown(cls):
    16         cls.driver.quit()
    17 
    18     def test_baidu_001(self):     #案例001  测试进入百度新闻界面
    19         self.driver.find_element_by_link_text('新闻').click()    #点击百度页面,超链接【新闻】两个字
    20         t.sleep(2)     #设置强制等待2秒,就是必须等待,用导入的time中的sleep方法,不是全局性,哪里需要设置到哪里,局部的
    21 
    22     def test_baidu__002(self):      #案例002  测试进入百度地图界面
    23         self.driver.find_element_by_link_text('地图').click()   ##点击百度页面,超链接【地图】两个字
    24         t.sleep(2)
    25 if __name__ =='__main__':
    26     unittest.main(verbosity=2)    #单元测试运行需要unittest.main(),作用是将一个单元测试模块变成可以直接运行的测试脚本

    顺序的问题我们清楚了,可是如果我们真的有上百条案了,当测试结果和上面的图一样的时候,我们还是会懵逼,比如测试结果第二条失败,那么第二条的测试内容测试点是什么?如果有上百条的test_baidu_00N  我们会记不住的,所以我们再次优化:我们在测试案例的方法中添加了注释

     1 import unittest                     #导入unittest
     2 import time as t                    #导入time  设置别名 t
     3 from selenium import webdriver      #导入selenium中的webdriver
     4 
     5 class page_baidu(unittest.TestCase):       #定义一个类,并继承unittest.TestCase类
     6 
     7     @classmethod                           #使用 @classmethod  装饰器函数,把方法变成类方法,可以直接调用方法,不需要实例化类对象就可以调用方法
     8     def setUp(cls):
     9         cls.driver = webdriver.Chrome()
    10         cls.driver.maximize_window()
    11         cls.driver.implicitly_wait(15)
    12         cls.driver.get(r'http://www.baidu.com')
    13         t.sleep(2)
    14     @classmethod
    15     def tearDown(cls):
    16         cls.driver.quit()
    17 
    18     '''以下案例是测试百度首页链接'''
    19     def test_baidu_001(self):     #案例001  测试进入百度新闻界面
    20         '''测试百度首新闻链接'''
    21         self.driver.find_element_by_link_text('新闻').click()    #点击百度页面,超链接【新闻】两个字
    22         t.sleep(2)     #设置强制等待2秒,就是必须等待,用导入的time中的sleep方法,不是全局性,哪里需要设置到哪里,局部的
    23 
    24     def test_baidu_002(self):      #案例002  测试进入百度地图界面
    25         '''测试百度首地图链接'''
    26         self.driver.find_element_by_link_text('').click()   ##点击百度页面,超链接【地图】两个字
    27         t.sleep(2)
    28         self.driver.back()
    29 
    30     '''以下案例是测试百度首页搜索'''
    31     def test_baidu_003(self):
    32         '''测试百度首页搜索功能'''
    33         self.driver.find_element_by_id('kw').send_keys('你好朋友')
    34 if __name__ =='__main__':
    35     unittest.main(verbosity=2)    #单元测试运行需要unittest.main(),作用是将一个单元测试模块变成可以直接运行的测试脚本

    这样即使我们有上百条案例,哪里出错后,我们都可以直观的看到,是那个测试点失败了。所以写测试案例的规范一定要遵守,给自己也给后面维护代码的人方便。

    unittest组成部分:

    TestCase:测试用例,测试用例里面会有很多测试方法,是单元测试中最小维度的测试行为

    Test Fixure:测试固件,测试固件是执行测试时的准备工作和收尾工作(打开和关闭浏览器,链接和关闭数据库等等)

    TestSuite:测试套件,是测试用例的集合

    TestRunner:测试运行器,运行测试用例

    TestReport:将测试结果呈现给用户,生成测试报告

    总结:测试固件的学习就是这么多了,后续有特殊的地方在单独笔记

    1、知道了setup() & tearDown() 两个方法的用法

    2、了解了setup() & tearDown() 与 setupClass() & tearDownClass() 他们之前的区别

    3、知道了运行的顺序

    4、对案例编写的规范有了一定程度的认识

  • 相关阅读:
    document.all用法
    $.ajax同步/异步(async:false/true)
    link 和@import 的区别
    如何对网页的加载进行性能优化
    border-style有哪些值?
    CSS设置DIV居中
    jquery选择器
    jQuery库中获取jQuery对象的方式
    Observer,观察者模式,C++描述
    Iterator,迭代器模式,C++描述
  • 原文地址:https://www.cnblogs.com/woshidaliua/p/11355039.html
Copyright © 2011-2022 走看看