• 第二个月课堂012讲解 _ Unittest框架(上)_高级讲师肖sir


    单元测试框架
    python当中的unittest单元测试框架
    开发经常使用的一个框架:单元测试的时候使用
    unittest单元测试框架的基本格式
    作用:管理和组织测试用例
    unittest ==》用来做单元测试
    常用的单元测试框架有哪些:pytest Junit nose java中==》testng

    ===============================================================================
    场景一:
    import unittest #导入unittest模块 #
    class Test(unittest.TestCase): #(定义一个类,一个 tsstcase的实例就是用例)
    # @classmethod #类方法
    # #静态方法,可以使用实例方法对象调用,也可以使用类进行调用,他的特点就是没有参数限制,定义需要在函前加@classmethod
    # def setUpClass(cls):
    # print ('类开始')
    # @classmethod
    # def tearDownClass(cls):
    # print ('类结束')
    def setUp(self): #创建driver对象、打开浏览器 #测试用例前执行
    print ('方法开始')
    def tearDown(self): #负责释放资源、关闭浏览器 #测试用例后执行
    print ('方法结束')
    def tset001(self): #测试用例1
    print (111)
    def test002(self): #测试用例2
            print (222)
    def test_a(self):
    print (333)
    def test_A(self):
    print (444)
    def fun(self):
    print (555)
    if __name__ == '__main__':
    unittest.main() #unittest单元测试框架的入口
    #unittest单元测试框架的总结:
    #1.只会运行以test开头的用例
    #2.test后面的运行顺序以ASCII码为准 0-9 A-Z a-z
    #3.类开始和类结束只会运行一次

    案例:1.2
    import unittest
    class A(unittest.TestCase):
    @classmethod
    def setUpClass(cls):
    print("类的开始")
    @classmethod
    def tearDownClass(cls):
    print("类的结束")
    def setUp(self):
    print("方法的开始")
    def tearDown(self):
    print("方法结束")
    def test001(self):
    print("测试用例1")
    def test005(self):
    print("测试用例5")
    def test002(self):
    print("测试用例2")
    if __name__ == '__main__':
    unittest.main()

    =============================================================================
    场景二:Suite可以管理多个case(case可以看做一个容器)
    2.1案例一:调用全部的用例
    import unittest
    from selenium import webdriver
    from time import sleep     #时间戳,导入time模块
    class Test_Baidu(unittest.TestCase):
        def setUp(self):    #方法开始
            self.driver = webdriver.Chrome()
            self.driver.get('http://www.baidu.com')
            self.driver.implicitly_wait(5)
        def test1(self):   #一条用例
            self.driver.find_element_by_id('kw').send_keys('duoceshi')
        def test2(self):  #一条用例
            self.driver.find_element_by_id('kw').send_keys('selenium')
        def tearDown(self):   # 方法结束      注意和位置没有关系的
            sleep(3)
            self.driver.close()
    if __name__ == '__main__':
    # #     #第一种运行方法:运行所有的用例
           unittest.main()
    #
    

      

     2.1案例一:使用suit

    import unittest #导入单元测试框架
    from selenium import webdriver
    import time
    class Bai_du(unittest.TestCase): #导入单元测试框架中的TestCase类
    def setUp(self):
    self.drvier=webdriver.Chrome()#创建一个浏览器对象
    self.drvier.get('http://www.baidu.com')
    self.drvier.maximize_window()#最大化
    self.drvier.implicitly_wait(10)#隐式等待
    def test01(self):
    self.drvier.find_element_by_id('kw').send_keys('多测师')
    def test02(self):
    self.drvier.find_element_by_id('kw').send_keys('mysql')
    def test03(self):
    self.drvier.find_element_by_id('kw').send_keys('python')
    def tearDown(self): #方法的结束在框架中也会默认所有的用例加载完毕后一个一个关闭浏览器
    time.sleep(2)#等待2秒后关闭当前浏览器
    self.drvier.close() #关闭浏览器释放资源
    if __name__ == '__main__': #在调用处来进行选择性执行
    suit=unittest.TestSuite()#创建一个容器对象
    suit.addTest(Bai_du('test01')) #单个选择
    # suit.addTests([Bai_du('test01'),Bai_du('test02')])#多个选择
    # run=unittest.TextTestRunner()#创建一个执行对象
    # run.run(suit) #通过对象调用run方法来运行选择的用例


    ================================================================
    场景三:路径搜索执行
    from  selenium import  webdriver
    from time import sleep
    import unittest
    class Test_Bu(unittest.TestCase):
    def setUp(self):
    self.driver=webdriver.Chrome()
    self.driver.get("https://www.baidu.com/")
    self.driver.maximize_window()
    self.driver.implicitly_wait(5)
    def tearDown(self):
    sleep(3)
    self.driver.close()
    def test001(self):
    self.driver.find_element_by_id('kw').send_keys("python")
    self.driver.find_element_by_id("su").click()
    def test002(self):
    self.driver.find_element_by_id('kw').send_keys("java")
    self.driver.find_element_by_id("su").click()
    def test003(self):
    self.driver.find_element_by_id('kw').send_keys("html")
    self.driver.find_element_by_id("su").click()
    if __name__ == '__main__':
    # 第三种方法:自动搜索用例执行
    path = r"C:UsersAdministratorPycharmProjectsuntitled3ui"
    a = unittest.TestLoader().discover(start_dir=path, pattern="aa*.py")
    runner = unittest.TextTestRunner()
    runner.run(a)
    ==================================================================
    场景四:执行报告
    from selenium import webdriver
    from time import sleep
    import unittest
    #from ui.HTMLTestRunner3_New import HTMLTestRunner
    class Test_Baidu(unittest.TestCase):
    def setUp(self):
    self.driver = webdriver.Chrome()
    self.driver.get('https://www.baidu.com')
    self.driver.maximize_window()
    self.driver.implicitly_wait(5)
    def tearDown(self):
    sleep(3)
    self.driver.close() #释放资源,关闭浏览器
    # 第一条自动化测试用例
    def test001(self):
    self.driver.find_element_by_id('kw').send_keys('python')
    self.driver.find_element_by_id('su').click()
    #第二条自动化测试用例
    def test002(self):
    self.driver.find_element_by_id('kw').send_keys('多测师')
    self.driver.find_element_by_id('su').click()
    #第三条自动化测试用例
    def test003(self):
    self.driver.find_element_by_id('kw').send_keys('hello!你好!')
    self.driver.find_element_by_id('su').click()
    # # # 第四种执行用例方法===》自动搜索+生成测试报告
    # if __name__ == '__main__':
    # path = r'C:UsersAdministratorPycharmProjectsuntitled3ui'
    # discover = unittest.TestLoader().discover(start_dir=path, pattern='ui*.py')
    # dir = r'C:UsersAdministratorPycharmProjectsuntitled3ui'+'\'+'ui.html'
    # filename = open(dir,'wb') #以二进制的方法写入文件内容
    # runner = HTMLTestRunner(stream=filename,
    # title='UI自动化测试报告',
    # description='用例执行情况如下',
    # tester='肖sir')
    # runner.run(discover)

    ==================================================================
    场景五:测试用例执行报告:加上时间

    from  selenium import  webdriver
    from time  import  *
    import unittest
    from  ui.HTMLTestRunner3_New import HTMLTestRunner
    class  Test_Bu(unittest.TestCase):
          def setUp(self):
              self.driver=webdriver.Chrome()
              self.driver.get("https://www.baidu.com/")
              self.driver.maximize_window()
              self.driver.implicitly_wait(5)
          def tearDown(self):
              sleep(3)
              self.driver.close()
          def test001(self):
              self.driver.find_element_by_id('kw').send_keys("python")
              self.driver.find_element_by_id("su").click()
          def test002(self):
              self.driver.find_element_by_id('kw').send_keys("java")
              self.driver.find_element_by_id("su").click()
          def test003(self):
              self.driver.find_element_by_id('kw').send_keys("html")
              self.driver.find_element_by_id("su").click()
    if __name__ == '__main__':
         # 第四种方法
         path=r"C:UsersAdministratorPycharmProjectsuntitled4ui"
         a = unittest.TestLoader().discover(start_dir=path, pattern="ui*.py")
         dir=r"C:UsersAdministratorPycharmProjectsuntitled4ui"
         now = strftime('%Y-%m-%d-%H-%M-%S')
         filename=dir+"\"+str(now) +'_ui.html'
         f=open(filename,"wb")
         runner=HTMLTestRunner(stream=f,
                               title="ui自动化测试报告",
                               description="用例执行情况",
                               tester="晶晶")
         runner.run(a)

     ============================================================ 

    场景六:(综合)
    # import unittest
    # from selenium import webdriver
    # from time import sleep     #时间戳,导入time模块
    # from  ui.HTMLTestRunner3_New import HTMLTestRunner  #导入HTMLTestRunner类==》用来生成测试报告的
    # import time
    # class Test_Baidu(unittest.TestCase):
    #     def setUp(self):    #方法开始
    #         self.driver = webdriver.Chrome()
    #         self.driver.get('http://www.baidu.com')
    #         self.driver.implicitly_wait(20)
    #     def test001(self):   #一条用例
    #         self.driver.find_element_by_id('kw').send_keys('duoceshi')
    #         self.driver.find_element_by_id('su').click()
    #     def test002(self):  #一条用例
    #         self.driver.find_element_by_id('kw').send_keys('selenium')
    #         self.driver.find_element_by_id('su').click()
    #         title = self.driver.title
    #         self.assertEqual(title,'百度一下,你就知道')
    #         self.assertIn(title,'百度一下,你就知道')
    #         self.assertNotEqual(title,'百度一下,你就知道123')
    #     def tearDown(self):   # 方法结束      注意和位置没有关系的
    #         sleep(3)
    #         self.driver.close()
    # # #定义一个普通函数
    # def all_case():  #一个套件中的测试用例
    #     suite = unittest.TestSuite()     #创建一个套件、或者说一个容器、作用就是用来装所有的用例suite是一个对象
    #     suite.addTest(Test_Baidu('test001'))  #把用例添加到套件里面
    #     # suite.addTest(Test_Baidu('test002'))
    #     # suite.addTests([Test_Baidu('test001'),Test_Baidu('test002')])   #放一个列表进去,对列表中的列表遍历
    #     return suite   #把装满了用例的suite套件返回给到函数的调用处
    # if __name__ == '__main__':
    # # #     #第一种运行方法:运行所有的用例
    # #        unittest.main()
    # # #     #第二种运行方法:可以选择运行用例
    #        runner = unittest.TextTestRunner()
    #        runner.run(all_case())
    # # # #     #第三种运行方法:自动搜索用例
    # #    # 在规定的目录下去搜索以less开头和.py结尾的模块中的用例
    #     start_dir = r'C:UsersAdministratorPycharmProjectsuntitledui'
    #     discover1 = unittest.defaultTestLoader.discover(start_dir=start_dir, pattern='lesson2*.py') #*通配符
    #     print (discover)
    #     runner = unittest.TextTestRunner()
    #     runner.run(discover)
    # #     #第四种运行方法:自动化搜索+生成测试报告
    #     start_dir = r'C:UsersAdministratorPycharmProjectsuntitledui'
    #     discover = unittest.defaultTestLoader.discover(start_dir=start_dir, pattern='less*.py')  #中间* 是通配符
    #     #1.定义生成的测试报告的名称
    #     path = r'C:UsersAdministratorPycharmProjectsuntitledui'
    #      ##报告生成在我们当前路径,copy本地路径
    #     now = time.strftime('%Y-%m-%d-%H-%M-%S')
    #     filename = path + "\" +str(now) + '_ui.html'     ##ui.html'表示
    #     f = open(filename,'bw')   #以二进制的方式在...ui.html文件中写入报告模板和测试结果
    #     ##w 是写,b 是表示二进制方式写入,
    #     runner = HTMLTestRunner(stream=f, title='百度ui自动化测试报告',description='用例执行情况如下:',)
    #     runner.run(discover)
    #     f.close()  #释放资源、关闭文件
    #
    #     runner = HTMLTestRunner(stream=f, title='百度用例', description='用例详细如下')
    #     runner.run(discover)  # 通过run来执行当前dis_cover匹配里面的文件

    TestCase: 
    一个Testcase的实例就是一个测试用例,测试用例就是一个完整的测试流程,包括初始化setUp、运行run、测试后的还原tearDown

    TestSuite: 
    对一个功能的测试往往需要多测试用例的,可以把多的测试用例集合在一起执行,这就是TestSuite的概念。常用addTest()方法将一个测试用例添加到测试套件中

    TextTestRunner: 
    是用来执行测试用例的,其中的run(test)用来执行TestSuite/TestCase。测试的结果会保存在TextTestResult实例中

    TestFixture: 
    测试准备前要做的工作和测试执行完后要做的工作.包括setUp()和tearDown()。通过覆盖TestCase的setUp和tearDown来实现。

    TestLoader:
    是用来搜索所有以test开头的测试用例,然后将其加入到testsuite中

    ---------------------------------------------------------------------------

     ======================================================
    报告设置:
    第一步:copy绝对路径
    C:UsersAdministratorPycharmProjectsuntitled5aogaoui.py
    第二步:

     

     

     ========================================================

    一、unittst框架的作用
    当我们写的用例越来越多时,我们就需要考虑用例编写的规范与组织,以便于后期的维护,而unittest正是这样一款工具
    二、unittest是Python自带的标准库中的模块,其中包括:
    1、TestCase类
    2、TestSuite类
    3、TestLoader类
    4、TextTestRunner类
    5、TextTestResult类
    6、TestFixture类
    解释下:
    TestCase:
    一个Testcase的实例就是一个测试用例,测试用例就是一个完整的测试流程,包括初始化setUp、运行run、测试后的还原tearDown
    TestSuite:
    对一个功能的测试往往需要多测试用例的,可以把多的测试用例集合在一起执行,这就是TestSuite的概念。常用addTest()方法将一个测试用例添加到测试套件中
    TextTestRunner:
    是用来执行测试用例的,其中的run(test)用来执行TestSuite/TestCase。测试的结果会保存在TextTestResult实例中
    TestFixture:
    测试准备前要做的工作和测试执行完后要做的工作.包括setUp()和tearDown()。通过覆盖TestCase的setUp和tearDown来实现。
    TestLoader:
    是用来搜索所有以test开头的测试用例,然后将其加入到testsuite中
    图形化解释:如下图

    三、框架的组成
    在写测试类以及测试用例时要规定一个命名习惯,一般测试类可以以Test开头,也可以以Test结尾。测试用例一般是以test开头。
    eg:结构如下:
    import unittest #导入unittest包
    #创建测试类:从unittest.TestCase继承
    classRomanNumeralConverterTest(unittest.TestCase):
    def setUp(self): #初始化测试环境
    def tearDown(self): #还原测试环境
    def test_case(self):测试用例
    四百度案例
    # -*- coding:utf-8 -*-
    from selenium import webdriver
    import unittest
    import time

    class x(unittest.TestCase):
    #setUp:用于设置初始化环境的,该类中的方法执行时都会先执行setup中
    #代码如:打开浏览器、变量赋值、连接数据库等工作
    def setUp(self):
    self.dr=webdriver.Chrome()
    self.dr.maximize_window()
    self.dr.implicitly_wait(20)#智能等待,sleep机械等待
    self.dr.get('http://www.baidu.com')

    #编写实际用例的地方
    #搜索多测师
    def test_caseA(self):
    self.dr.find_element_by_id('kw').send_keys(u'多测师')
    sleep(3)

    #搜索达内
    def test_case3(self):
    self.dr.find_element_by_id('kw').send_keys(u'达内')
    sleep(3)

    #搜索北大青鸟
    def test_case2(self):
    self.dr.find_element_by_id('kw').send_keys(u'北大青鸟')
    sleep(3)
    #用例执行完,还有测试环境如:退出登录、断开数据库、关闭浏览器
    def tearDown(self):
    self.dr.quit()#关闭所有窗口
    if __name__ == '__main__':
    unittest.main()#
    #unittest.main():使用它可以将一个单元测试模块变为可直接运行的测试脚本,main()方法使用TestLoader类来搜索所有包含在该模块中以“test”命名开头的测试方法,并自动执行
    注意:pycharm工具默认执行方式为unittests方式
    五、组织用例集
    这里我们假设,脚本当中有多个TestCase如test_case1,test_case2…,那我们应该怎样去控制它们的执行顺序
    #执行方案一:
    if __name__ == '__main__':
    unittest.main()#
    注:这里它搜索所有以test开头的测试用例方法,根据ASCII码的顺序加载测试用例, 数字与字母的顺序为:0-9,A-Z,a-z
    #执行方案二:
    if __name__ == '__main__':
    suite=unittest.TestSuite()#构造测试容器(先实例化测试套件)
    suite.addTest(baidu('test'))#添加用例
    suite.addTest(baidu('test_jd'))
    #suite.addTests([foo('test_dcs'),foo('test_dn'),foo('test_bdqn')])
    run=unittest.TextTestRunner()#获取运行方法
    run.run(suite)
    注:执行的顺序是用例的加载顺序,比如这里是先执行2后执行1。
    #执行方案三:执行顺序和方案一相同(路径不要太深,复杂)
    在方案2中,如果我们有成百上千个用例的话,一个一个add进去,是不太现实的,那么我们可以用defaultTestLoader来加载,该添加方法不过当前py文件下有多少个用例有多少个类,都可以执行
    if __name__ == '__main__':
    test_dir = './'
    discover=unittest.defaultTestLoader.discover(test_dir,pattern='*d3.py')
    runner = unittest.TextTestRunner()
    runner.run(discover)
    自动化用例编写注意点:
    1、一个自动化脚本就是一个完整的场景:从开始---执行过程---结束(退出)
    2、一个自动化脚本只验证一个功能点,不要试图把所有功能都写在一个用例中
    3、编写自动化用例尽量是正常场景,避免异常场景(用名不填验证登录)
    4、自动动化用例直接尽量保证独立性,不要造成一个用例与多个用例产出数据上或
    业务上的关联,这会给后期带来用例维护上的不便
    5、自动化用例的断言,只针对需要断言的地方进行断言(重要环节),没必要在每个
    个环境进行断言验证

     
  • 相关阅读:
    Red Hat Enterprise Linux 7.x新特性
    PostgreSQL角色和权限
    PostgreSQL的约束
    Postgresql临时表
    启迪心灵的句子
    Quartz 2.2 动态添加、修改和删除定时任务
    mysql 操作杂记
    ORA-12514: TNS: 监听程序当前无法识别连接描述符中请求的服务解决
    oracle 归档日志
    centos添加硬盘
  • 原文地址:https://www.cnblogs.com/xiaolehua/p/14100603.html
Copyright © 2020-2023  润新知