自动化测试——unittest框架(单元测试)

这篇具有很好参考价值的文章主要介绍了自动化测试——unittest框架(单元测试)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、unittest框架解析

1.1unittest的5个重要概念

1.1测试用例的编写及代码

1.2断言

1.3用例的执行顺序

1.4测试用例综合管理框架

1.5HTML报告生成


参考博文

一、unittest框架解析

unittest 单元测试提供了创建测试用例,测试套件以及批量执行的方案, unittest 在安装pyhton 以后就直接自带了,直接import unittest 就可以使用。

 unittest 对程序最小模块(类或者方法)的一种敏捷化的测试。

单元测试:针对程序模块中进行正确性校验的测试工作(特点:应用中的最小可测单元、测试执行速度快、发现问题,更容易定位,一般由开发人员进行,也即是白盒测试)

在自动化测试中,我们不需要做白盒测试。利用单元测试框架,创建一个类,继承unittest的TestCase,这样可以把每个case看成是一个最小的单元, 由测试容器组织起来,直接执行,同时引入测试报告。

单元unittest框架:针对UI界面的功能进行自动化测试。不同于Java和Junit单元测试框架

unittest的5个重要概念

unittest 各组件的关系为:

unittest自动化测试,单元测试,unit testing

  1. test fixture(测试固件):即测试环境的搭建。比如创建临时的数据库,文件和目录等。一般通过初始化(前置)和清理测试环境(结束)实现。
    1. setUp():测试用例执行前的准备:如环境、数据等
    2. setDown():测试环境的清理操作,如关闭浏览器等
  2. test case:测试用例(def test_add()),TestCase 是编写单元测试用例最常用的类:一个测试用例就是一个完成的测试单元,需执行setup()--->run()---->setDown()
  3. test suite:测试用例的集合集,TestSuite 是最常用的类
    1. addTest(): 把单个测试用例一个一个的放进测试用例集合里
    2. makeSuit(): 把一个类里的所有测试用例添加到一个测试套件里
    3. TestLoader(): 同上
    4. discover(): 把一个确定的文件夹下,以某种形式命名文件中的所有测试用例形成一个测试套件
  4. test runner:执行测试用例
  5. test loader:生成测试报告

unittest的用例规则:

  • ​ 1、测试文件必须导包:import unittest
  • ​ 2、测试类必须继承 类:unittest.TestCase
  • ​ 3、测试方法必须以 test_开头

TestCase类中的几个特殊方法:

  • setUp():测试前的初始化工作(所有测试用例开始前都会执行的)
  • tearDown():测试后的清理工作
  • setUpClass():@classmethod,在所有测试方法运行前执行,只会执行一遍
  • tearDownClass():@classmethod,在所有测试方法运行结束后执行,只会执行一遍

1.1测试用例的编写及代码

类代码cal.py:

class Math1:
    def __init__(self,a,b):
        self.a = int(a)
        self.b = int(b)
        
    def add(self):
        return self.a + self.b
    
    def sub(self):
        return self.a - self.b

 测试代码:

from cal import Math1  
import unittest
# from selenium import webdriver

#创建测试用例的类TestMath,必须继承类unittest.TestCase
class TestMath(unittest.TestCase):
#----------------------测试前的初始化工作---------------------#   
    @classmethod  #加上修饰,说明是类的修饰,只在类里执行,因为只有一个集合类,所以只执行一遍
    def setUpClass(cls):
        print("setUpClass")
        
    def setUp(self):
        print("setUp")         #两条测试用例都会执行,执行两次  
        
#----------------------测试用例的编写---------------------#           
    def test_add(self):
        j = Math1(4,3)
        self.assertEqual(j.add(),7 ) 
         
    def test_sub(self):
        i = Math1(26,5)
        self.assertEqual(i.sub(), 21)
         
#----------------------测试后的结束工作---------------------#   
    def tearDown(self):
        print("tearDown")       #两条测试用例都会执行,执行两次   
          
    @classmethod
    def tearDownClass(cls):
        print("tearDownClass")
        
#----------------------测试用例的执行---------------------#   

if __name__ == "__main__":
    
    #构造测试集:放入所有测试用例  :此处表示由两个测试用例组成的测试集
    suite = unittest.TestSuite()
    suite.addTest(TestMath('test_add'))   #将单个测试用例放入测试用例集合中
    suite.addTest(TestMath('test_sub'))
    
    #执行测试用例
    runner = unittest.TextTestRunner()   #调用方法
    runner.run(suite)  #直接执行测试用例集

1.2断言

断言:测试用例实际结果与预期结果的对比

测试用例的要素:测试环境、测试步骤、输入、实际结果、预期结果

unittest 的单元测试库中常用的断言方法:

unittest自动化测试,单元测试,unit testing


1.3用例的执行顺序

默认执行规则:测试类或测试方法的数字语字母顺序:0-9,A-Z,a-z(先执行完一个类中的方法,才会执行下一个类)

忽略测试用例的执行:@unittest.skip("skipping")

1.4测试用例综合管理框架

测试综合管理框架包括:

1.StartEnd.py : 开始和结束工作:setUp 和tearDown

2.cal.py:  加减法实现,整体功能模块

3.test_add.py:单个功能测试用例

4.test_sub.py:单个功能测试用例

5.run.py:用例执行

F:用例出现缺陷

.:成功

E:脚本中出现错误

1)StartEnd.py:

import unittest

class setUp_tearDown(unittest.TestCase):
    def setUp(self):
        print("开始测试")
        
    def tearDown(self):
        print("测试结束")

2)cal.py:  加减法实现,整体功能模块

class Math1:
    def __init__(self,a,b):
        self.a = int(a)
        self.b = int(b)
        
    def add(self):
        return self.a + self.b
    
    def sub(self):
        return self.a - self.b

3)test_add.py:单个功能测试用例

from cal import *
from StartEnd import *

class Test_add(setUp_tearDown):
    
    def test_add(self):
        j = Math1(5,9)
        self.assertEqual(j.add(),14)
        
    def test_addError(self):
        j =  Math1(5,9)
        self.assertNotEqual(j.add(),6)

4)test_sub.py:单个功能测试用例

from StartEnd import *
from cal import *

class Test_sub(setUp_tearDown):
    
    def test_sub(self):
        i = Math1(48,45)
        self.assertEqual(i.sub(),3)

5)run.py

import unittest

test_dir = './'

#批量执行当前测试用例

discovery = unittest.defaultTestLoader.discover(test_dir,pattern="test*.py")

if __name__ == "__main__":
    runner = unittest.TextTestRunner()
    runner.run(discovery)

6)完整的测试代码:使用了unittest框架的脚本

from selenium import webdriver
import unittest
import time
import os
from selenium.common.exceptions import NoAlertPresentException
from selenium.common.exceptions import NoSuchElementException

class Baidu1(unittest.TestCase):
    
    def setUp(self):   #初始化环境,测试开始前执行的操作
        print("-----setUp-----")
        self.driver = webdriver.Chrome()
        self.url = "https://www.baidu.com/"
        self.driver.maximize_window()
        time.sleep(3)
        
    def tearDown(self):            #测试结束后清理环境
        print("--------tearDown--------")
        self.driver.quit()      #关闭浏览器
    
#--------------测试用例 test_hao  和test_hao -------#
  # 每个测试用例执行时都会执行开始和结束操作:setup    
   #忽略测试用例的执行: @unittest.skip("skipping")    
    def test_hao(self):
        driver = self.driver
        url = self.url
        driver.get(url)
        driver.find_element_by_link_text("hao123").click()   #定位到百度页面的超链接“hao123”,也可以定位到“新闻”等其他超链接
        time.sleep(6)
        
    def test_hbaidu(self):
        driver = self.driver
        url = self.url 
        driver.get(url)
        # self.assertTrue("百度一下,你就知道" == driver.title, msg="不一致!!!")
        driver.find_element_by_id("kw").send_keys("告白气球")
        driver.find_element_by_id("su").submit()
        time.sleep(3)
        print(driver.title)
        try:
            self.assertNotEqual(driver.title,"告白气球_百度搜索",msg="实际结果与预期结果不一致")
            
        except:
            self.saveScreenAsPhoto(driver,"haohao.png")
        time.sleep(3)
        
    def saveScreenAsPhoto(self,driver,file_name):
        if not os.path.exists("./images"):
            os.makedirs("./images")
        now = time.strftime("%Y%m%d-%H%M%S",time.localtime(time.time()))
        driver.get_screenshot_as_file("./images/" + now + "-" + file_name)
        
    
if __name__ == "__main__":
    unittest.main()   #执行所有测试用例(类中的所有方法)

unittest提供了全局的main()方法:使用它可以方便地将一个单元测试模块变成可以直接运行的测试脚本。main()方法搜索所有包含在该模块中以”test"命名的测试方法,并自动执行他们。

1)跑测试用例套件的步骤:此前提是要先把单个测试用例添加到套件里

  • 先生成测试套件: suite = creatSuit()
  • 得到跑测试套件的runner:runner = unittest.TextTestRunner(verbosity=2)
  • 用runner跑套件:runner.run(suite)
import unittest
from src0716 import testbaidu1
from src0716 import testbaidu2
def createsuite():
    #addTest
    suite = unittest.TestSuite()
    suite.addTest(testbaidu1.Baidu1("test_hao"))   #添加测试文件中的测试用例,此方法只能一个一个添加
    suite.addTest(testbaidu1.Baidu1("test_hbaidu"))
    suite.addTest(testbaidu2.Baidu2("test_hao"))
    suite.addTest(testbaidu2.Baidu2("test_baidusearch"))
    return suite
if __name__=="__main__":
    suite = createsuite()
    runner = unittest.TextTestRunner(verbosity=2)
    runner.run(suite)

1.5makeSuite()、TestLoader()、discover()的应用

makeSuite:把一个测试用例类里的所有测试用例case组成测试套件TestSuite 

TestLoader :创建类和模块的测试套件,使TestLoader().loadTestsFromTestCase(TestClass) 来加载测试类。

discover :通过递归方式到其子目录中从指定的目录开始, 找到所有测试模块并返回包含它们对象的TestSuite ,然后加载与模式匹配唯一的测试文件,discover(dir,pattern,top_level_dir=None)

(1)把一个类里的测试用例添加到套件间里,代码如下:

import unittest,csv
import os,sys
import time
import testbaidu1
import testbaidu2
#手工添加案例到套件,
def createsuite():
    suite = unittest.TestSuite()
    #将测试用例加入到测试容器(套件)中
    suite.addTest(unittest.makeSuite(testbaidu1.Baidu1))
    suite.addTest(unittest.makeSuite(testbaidu2.Baidu2))
    return suite

    '''
    suite1 = unittest.TestLoader().loadTestsFromTestCase(testbaidu1.Baidu1)
    suite2 = unittest.TestLoader().loadTestsFromTestCase(testbaidu2.Baidu2)
    suite = unittest.TestSuite([suite1, suite2])
    return suite
    '''

if __name__=="__main__":
    suite=createsuite()
    runner = unittest.TextTestRunner(verbosity=2)
    runner.run(suite)

(2)把一个文件夹下以某种形式命名(正则表达式匹配)的所有文件的测试用例都加载到测试套件:

import unittest,csv
import os,sys
import time

#手工添加案例到套件,
def createsuite():
    discover=unittest.defaultTestLoader.discover('../test',pattern='test*.py',top_le
    vel_dir=None)
    print discover
    return discover

if __name__=="__main__":
    suite=createsuite()
    runner = unittest.TextTestRunner(verbosity=2)
    runner.run(suite)

1.6HTML报告生成

1)添加HTMLTestRunner.py文件:C:\Users\HY\AppData\Local\Programs\Python\Python38\lib

2)HTML报告的生成步骤:

解决HTML文件存放问题--->创建文件夹

HTML报告命名问题(动态命名,使每个文件名不一样)

# -*- coding: utf-8 -*-
import unittest,csv
import os,sys
import time
import HTMLTestRunner

#手工添加案例到套件,
def createsuite():
    discover=unittest.defaultTestLoader.discover('../test',pattern='test*.py',top_level_dir=None)
    print(discover)
    return discover

if __name__=="__main__":
    curpath=sys.path[0]
    #取当前时间
    now=time.strftime("%Y-%m-%d-%H %M %S",time.localtime(time.time()))
    if not os.path.exists(curpath+'/resultreport'):
        os.makedirs(curpath+'/resultreport')
    filename=curpath+'/resultreport/'+now+'resultreport.html'
    with open(filename,'wb') as fp:
    #出html报告
        runner = HTMLTestRunner.HTMLTestRunner(stream=fp,title=u'测试报告',description=u'用例执行情况',verbosity=2)
        suite=createsuite()
        runner.run(suite)

1.7错误截图

关键语句:driver.get_screenshot_as_file()    

def savescreenshot(self,driver,file_name):
    if not os.path.exists('./image'):
        os.makedirs('./image')
    now=time.strftime("%Y%m%d-%H%M%S",time.localtime(time.time()))
#截图保存
    driver.get_screenshot_as_file('./image/'+now+'-'+file_name)
    time.sleep

1.8数据驱动

@data :支持一个或者多个数据的传入

@unpack :多个数据传入需对一组数据进行映射,包括:测试数据和测试方法的映射

@file_data:测试数据在json文件中,和测试方法中的参数进行映射文章来源地址https://www.toymoban.com/news/detail-796937.html

到了这里,关于自动化测试——unittest框架(单元测试)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • (六)Selenium自动化测试实战—unittest框架

    上一篇:(五)Selenium自动化测试实战—PO模式_要开朗的spookypop的博客-CSDN博客 先看下代码的运行效果: 运行自动化测试代码 unittest是python单元测试框架,它提供了一组丰富的工具来构建和运行测试,可以满足日常做自动化测试的需求。 上一篇详细的介绍了如何用PO模式写登

    2023年04月14日
    浏览(30)
  • 自动化测试框架unittest与pytest的区别!

    前面文章已经介绍了python单元测试框架,大家平时经常使用的是unittest,因为它比较基础,并且可以进行二次开发,如果你的开发水平很高,集成开发自动化测试平台也是可以的。而这篇文章主要讲unittest与pytest的区别,pytest相对unittest而言,代码简洁,使用便捷灵活,并且插

    2024年02月15日
    浏览(28)
  • Python自动化测试:unittest与pytest框架

    在Python中, unittest 和 pytest 都是常用的自动化测试框架。它们提供了编写测试用例、测试套件和执行测试的强大功能。 1. unittest框架 unittest 是Python标准库的一部分,因此无需额外安装。它提供了丰富的断言方法,用于验证测试结果。 示例代码: python复制代码 import unittest c

    2024年02月20日
    浏览(35)
  • Python自动化测试框架之unittest使用详解

    unittest是Python自动化测试框架之一,提供了一系列测试工具和接口,支持单元测试、功能测试、集成测试等多种测试类型。unittest使用面向对象的思想实现测试用例的编写和管理,可以方便地扩展和定制测试框架,支持多种测试结果输出格式 unittest 是python 的单元测试框架,它

    2024年02月07日
    浏览(41)
  • 自动化测试概念(以及部分框架,selenium,unittest)

      能够代替手工测试的方法和工具都可以称为自动化测试      例如   针对不同的测试对象   web自动化   app自动化  接口自动化      针对不同的测试类型   功能测试自动化   链接测试自动化   性能测试自动化   安全测试自动化      实施自动化测试的目的在于

    2024年03月14日
    浏览(36)
  • Python自动化测试实战篇:unittest框架详解

    按照测试阶段来划分,可以将测试分为单元测试、集成测试、系统测试和验收测试。单元测试是指对软件中的最小可测试单元在与程序其他部分相隔离的情况下进行检查和验证的工作,通常指函数或者类,一般是开发完成的。 单元测试可以将测试工作前移,及早发现问题,降

    2024年02月06日
    浏览(30)
  • Selenium+Unittest自动化测试框架实战(框架源码都给你)

    目录 前言 项目框架 首先管理时间 !/usr/bin/env python3 -- coding:utf-8 -- 配置文件 conf.py config.ini# 读取配置文件 记录操作日志 简单理解POM模型 管理页面元素 封装Selenium基类 创建页面对象 熟悉unittest测试框架 编写测试用例 执行用例 生成测试报告 执行并生成报告 发送结果邮件 se

    2024年02月15日
    浏览(33)
  • 如何编写接口自动化框架系列之unittest测试框架的详解(二)

    在编写自动化框架过程中 ,我们首先想到的就是选择一个合适的测试框架 ,目前常用的测试框架有unittest和pytest , unittest比较简单,适合入门着学习 ;而pytest比较强大,适合后期进阶 。本文主要介绍的就是unittest框架 。接下来 ,我们从以下三个问题开始说明: unittest是什么

    2024年02月07日
    浏览(45)
  • Python 自动化测试框架unittest与pytest的区别

    📌 博客主页: 美团程序员 📌 专注于软件测试领域相关技术实践和思考,持续分享自动化软件测试开发干货知识! 📌 如果你也想学习软件测试,文末卡片有我的交流群632880530,加入我们,一起交流和学习! 引言 前面一篇文章Python单元测试框架介绍已经介绍了python单元测

    2024年02月13日
    浏览(32)
  • Python自动化测试框架:Pytest和Unittest的区别

    pytest和unittest是Python中常用的两种测试框架,它们都可以用来编写和执行测试用例,但两者在很多方面都有所不同。本文将从不同的角度来论述这些区别,以帮助大家更好地理解pytest和unittest。 1. 原理 pytest是基于Python的assert语句和Python的自省特性实现测试框架,其原理是基于

    2024年02月10日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包