IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发测试 -> 自动化测试Selenium+Python+UnitTest系列详细教程四:集成UnitTest单元测试框架 -> 正文阅读

[开发测试]自动化测试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/接口自动化测试,测试开发,性能测试流,或者想搭建属于自己的一套自动化测试框架。欢迎加入软件测试技术全栈交流群:821268239,群里会有笔者熬夜精心整理的测试干货,包括面试题、视频、原创文章等资料大礼包。还有大厂高级测试开发一起交流技术

  开发测试 最新文章
pytest系列——allure之生成测试报告(Wind
某大厂软件测试岗一面笔试题+二面问答题面试
iperf 学习笔记
关于Python中使用selenium八大定位方法
【软件测试】为什么提升不了?8年测试总结再
软件测试复习
PHP笔记-Smarty模板引擎的使用
C++Test使用入门
【Java】单元测试
Net core 3.x 获取客户端地址
上一篇文章      下一篇文章      查看所有文章
加:2021-07-29 11:57:30  更:2021-07-29 11:57:36 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/17 20:39:22-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码