自动化测试Selenium+Python+UnitTest系列详细教程四:集成UnitTest单元测试框架

前言:

        unittest以一种面向对象的方式产生了一些很重要的概念,如果没有面向对象基础,请补充python面向对象知识

unittest简介

unittest是Python单元测试框架,类似于Java的JUnit框架。以下是unittest官方文档demo,

这是对三个字符串方法(upper、isupper、split)进行单元测试的简短脚本:

import unittest
 
class TestStringMethods(unittest.TestCase):
 
    def test_upper(self):
        self.assertEqual('foo'.upper(), 'FOO')
 
    def test_isupper(self):
        self.assertTrue('FOO'.isupper())
        self.assertFalse('Foo'.isupper())
 
    def test_split(self):
        s = 'hello world'
        self.assertEqual(s.split(), ['hello', 'world'])
        # check that s.split fails when the separator is not a string
        with self.assertRaises(TypeError):
            s.split(2)
 
if __name__ == '__main__':
    unittest.main()

运行结果:3个测试用例运行成功,用例运行结果为pass

   

...
----------------------------------------------------------------------
Ran 3 tests in 0.000s

OK

unittest不仅能够支持简单的单元测试和复杂的功能测试, 还可以用来做等UI自动化测试、接口自动化测试

unittest的意义:

        少数的自动化测试用例维护起来看起来是很容易的,但随着项目不断更新迭代,测试套件将持续的增长,测试用例脚本也将变得越来越臃肿庞大,所以我们需要用到一些测试框架对用例的管理和维护。

         1.灵活的组织管理自动化用例、冒烟测试用例        

         2.让用例高效的执行 :可以批量运行大量用例,选中部分用例运行       

         3.用例的断言:方便验证测试用例的结果          

         4.测试报告:自动生成html形式测试报告

unittest基础语法规则:

1.一个用例class继承unittest.TestCase类,用例类里面的方法即是一个个具体的测试用例TestCase

类方法名称必须以 test 开头,否则是不被unittest识别成用例

类的名称可以不以test开头

# @Author : 一诺教育
# @File : 0728
import unittest
class YiNuo(unittest.TestCase):
    '''
    YiNuo:代表用例类的名称,继承了unittest.TestCase类
    '''   
    def testcase01(self):
        print('方法名称test开头,代表自动化测试用例1')

    def testcase02(self):
        print('方法名称test开头,代表自动化测试用例2')

    def yinuocase03(self):
        print('方法名称yinuo开头,代表非自动化测试用例')


if __name__ == '__main__':

    unittest.main(verbosity=2)  #main方法运行YiNuo类中所有的测试用例(以test开头的函数)

运行结果:

..
----------------------------------------------------------------------
Ran 2 tests in 0.000s

OK

        testcase01和testcase02名称以test开头代表测试用例,yinuocase03非测试用例

2.unittest运行机制

        a.运行当前文件所有用例

        unittest.main()方法会运行当前py文件中,所有继承了unittest.TestCase的类里面的用例

比如当前文件有俩个类,都继承了unittest.TestCase,则会运行所有俩个类里面的以test开头的用例,示例代码如下所示:

         b.运行当前py文件部分用例:

TestSuite:这个类代表一个测试用例或测试套件的集合

addTest(addTests):把TestCase和TestSuite中给的所有的测试实例添加到套件中。

TextTestRunner:一个基础的测试执行器,实现了将结果输出为流的功能。

run:该方法是TextTestRunner主要公共接口,该方法需要一个TestSuite或者TestCase实例作为参数

# @Author : 一诺教育
# @File : 0728
import unittest
from selenium import webdriver
class TestCase1(unittest.TestCase):

    def testcase01(self):
        print('这是项目1的自动化测试用例1')

    def testcase02(self):
        print('这是项目1的自动化测试用例2')
class TestCase2(unittest.TestCase):

    def testcase01(self):
        print('这是项目2的自动化测试用例1')

if __name__ == '__main__':
    #创建一个测试套件testcases
    testcases = unittest.TestSuite()
    #往测试套件添加测试用例TestYiNuo
    testcases.addTests([TestCase1('testcase02'),TestCase2('testcase01')])
    runner=unittest.TextTestRunner()
    runner.run(testcases)

以上套件只添加了项目1的用例2,项目2的用例1,所以只会执行俩个用例,运行结果如下:

..
----------------------------------------------------------------------
Ran 2 tests in 0.000s

OK
这是项目1的自动化测试用例2
这是项目2的自动化测试用例1

        c.运行多个py文件以及多个类的测试用例:

  当用例越来越多的时候,肯定会分多个py文件写用例,比如一个模块的用例会放到一个py文件。

如果想要在多个py文件选择用例运行,

TestLoader:经常用来从类和模块中提取创建测试套件,TestLoader对象具有以下方法:

loadTestsFromTestCase(testCaseClass) ,此用法可以同时测试多个类,如果运行其它py文件的用例类,只需要将该类import,然后添加到测试套件中去

# @Author : 一诺教育
# @File : 0728
import unittest
from selenium import webdriver
class TestCase1(unittest.TestCase):

    def testcase01(self):
        print('这是项目1的自动化测试用例1')

    def testcase02(self):
        print('这是项目1的自动化测试用例2')
class TestCase2(unittest.TestCase):

    def testcase01(self):
        print('这是项目2的自动化测试用例1')

if __name__ == '__main__':
    #创建一个测试套件testcases
    testcases = unittest.TestSuite()
    #往测试套件添加TestCase1用例类
    testcases.addTests(unittest.TestLoader().loadTestsFromTestCase(TestCase1))
    #往测试套件添加TestCase2用例类
    testcases.addTests(unittest.TestLoader().loadTestsFromTestCase(TestCase2))
    #运行测试套件
    runner=unittest.TextTestRunner()
    runner.run(testcases)

loadTestsFromName(文件名.类名称.方法名称) :

    

if __name__ == '__main__':
    #创建一个测试套件testcases
    testcases = unittest.TestSuite()
    #往测试套件添加测试用例
    testcases.addTests(unittest.TestLoader().loadTestsFromNames
(['0728.TestCase1.testcase01','0728.TestCase1.testcase02']))
    #运行测试套件
    runner=unittest.TextTestRunner()
    runner.run(testcases)

0728当前py文件的文件名称

3.每一个用例执行的结果的标识,成功是 .,失败是 F,出错是 E

4.verbosity参数可以控制执行结果的输出,0 是简单报告、1 是一般报告、2 是详细报告。

5.用 setUp()、tearDown()、setUpClass()以及 tearDownClass()可以在用例执行前布置环境,以及在用例执行后清理环境

setUp():用例执行之前的前置操作,有多少个用例就会执行多少次

tearDown():用例执行之后的后置操作,有多少个用例就会执行多少次

# @Author : 一诺教育
# @File : 0728
import unittest
from selenium import webdriver
class YiNuo(unittest.TestCase):
    '''
    YiNuo:代表用例类的名称,继承了unittest.TestCase类
    '''
    def setUp(self) -> None:
        '''
        这是每个用例的前置,有多少个用例就执行多少次
        例如:每个用例执行单独打开一次浏览器
        :return:
        '''
        self.driver=webdriver.Chrome()
        print('这是每个用例的前置')

    def tearDown(self) -> None:
        '''
        这是每个用例的后置,有多少个用例就执行多少次
        例如:每个用例执行完成就关闭浏览器
        :return:
        '''
        self.driver.close()
        print('这是每个用例的后置')

 setUpClass:所有用例执行之前的前置操作,仅执行一次

 tearDownClass:所有用例执行之前的后置操作,仅执行一次

注意:需要加@classmethod装饰器,代码如下所示:

# @Author : 一诺教育
# @File : 0728
import unittest
from selenium import webdriver
class YiNuo(unittest.TestCase):
    '''
    YiNuo:代表用例类的名称,继承了unittest.TestCase类
    '''
    @classmethod
    def setUpClass(self) -> None:
        '''这是所有用例的后置,有多少个用例就执行多少次。
        例如:所有用例共用一个浏览器,只登录一次'''
        self.driver=webdriver.Chrome()
        print('这是所有用例的后置')

    @classmethod
    def tearDownClass(self) -> None:
        '''这是所有用例的后置,有多少个用例就执行多少次。
         例如:所有用例执行完成,退出浏览器'''
        self.driver.quit()
        print('这是所有用例的后置')

6.可以用第三方库HTMLTestRunner生成html报告。

1.下载HTMLTestRunner文件,放在当前py文件同级目录,(参数中加stream,可以将报告输出到文件:)

2.导入HTMLTestRunner文件HTMLTestRunner类

3.定义测试报告生成路径

示例代码如下:

# @Author : 一诺教育
import unittest
from selenium import webdriver
from HTMLTestRunner import HTMLTestRunner
class TestCase1(unittest.TestCase):

    def testcase01(self):
        print('这是项目1的自动化测试用例1')

    def testcase02(self):
        print('这是项目1的自动化测试用例2')


if __name__ == '__main__':
    #创建一个测试套件testcases
    testcases = unittest.TestSuite()
    #往测试套件添加测试用例
    testcases.addTests(unittest.TestLoader().
                       loadTestsFromNames(['0728.TestCase1.testcase01']))

    #定义测试报告生成的路径:
    report_dir='./test_report.html'
    #往测试报告写入测试结果,w表示打开文件的方式是“写入”,b表示二进制
    file=open(report_dir,'wb')

    # 通过HTMLTestRunner运行测试套件
    runner = HTMLTestRunner(
        title="一诺教育商城项目",
        description="自动化用例测试报告",
        stream=file,
        verbosity=2,
    )
    runner.run(testcases)

生成html形式自动化测试报告

 正在学习软件测试的小伙伴,想学习web/接口自动化测试,测试开发,性能测试,或者想搭建属于自己的一套自动化测试框架。或者正在找工作的朋友可以去B站我的主页清风说测试开发的个人空间_哔哩哔哩_Bilibili看看视频,免费无广告,给大家一些面试题的还包括解题思路,测试思维最重要

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值