iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >【自动化测试】Python - uni
  • 966
分享到

【自动化测试】Python - uni

测试Pythonuni 2023-01-31 08:01:31 966人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

一、测试模型 下面这部分来自于某书籍资料,拿过来,按需参考一下: 测试模型(1)线性测试1、概念:通过录制或编写对应应用程序的操作步骤产生的线性脚本。单纯的来模拟用户完整的操作场景。(操作,重复操作,数据)都混合在一起。2、优点:每个


一、测试模型

下面这部分来自于某书籍资料,拿过来,按需参考一下:

测试模型
(1)线性测试
1、概念:
通过录制或编写对应应用程序的操作步骤产生的线性脚本。单纯的来模拟用户完整的操作场景。(操作,重复操作,数据)都混合在一起。
2、优点:每个脚本相对独立,且不产生其他依赖和调用。任何一个测试用例脚本拿出来都可以单独执行。
3、缺点:开发成本高,用例之间存在重复的操作。比如重复的用户登录和退出。
维护成本高,由于重复的操作,当重复的操作发生改变时,则需要逐一进行脚本的修改。
4.线性测试实例:用户登录
(2)模块化驱动测试
1、概念:
将重复的操作独立成功共模块,当用例执行过程中需要用到这一模块操作时则被调用。
操作+(重复操作,数据)混合在一起。例如,自动化测试的执行需要保持测试用例的独立性和完整性,所以每一条用例在执行时都需要登录和退出操作,so可以把登录和退出的操作封装为公共函数。
2、优点:由于最大限度消除了重复,从而提高了开发效率和提高测试用例的可维护性。
3、缺点:虽然模块化的步骤相同,但是测试数据不同。比如说重复的登录模块,如果登录用户不同,依旧要重复编写登录脚本。
4.实例:对公共模块,例如登陆和退出进行模块化封装
(3)数据驱动测试
1、概念:它将测试中的测试数据和操作分离,数据存放在另外一个文件中单独维护。
通过数据的改变从而驱动自动化测试的执行,最终引起测试结果的改变。
操作+重复操作+数据分开。
2、优点:
通过这种方式,将数据和重复操作分开,可以快速增加相似测试,完成不同数据情况下的测试。
3、实例从excel表格读取用户名密码,登录邮箱。

二、unittest框架

python搭建自动化测试框架,需要组织用例以及测试执行,大部分推荐的是unittest。现在用的也是这个,随着了解,也有其他的框架,有时间再多去学习,保持持续学习哦~
附上官方文档地址:链接描述 https://docs.Python.org/2.7/l...

unittest是Python自带的单元测试框,可以用来作自动化测试框架的用例组织执行框架。优点:提供用例组织与执行方法;提供比较方法;提供丰富的日志、清晰的报告。
大致流程:

  • 写好TestCase
  • 由TestLoader加载TestCase到TestSuite
  • 然后由TextTestRunner来运行TestSuite,运行的结果保存在TextTestResult中。
    通过命令行或者unittest.main()执行时,main会调用TextTestRunner中的run()来执行,或者可以直接通过TextTestRunner来执行用例。
    在Runner执行时,默认将执行结果输出到控制台,我们可以设置其输出到文件,在文件中查看结果。

unittest中最核心的部分是:TestFixture、TestCase、TestSuite、TestRunner。

1、Test fixture

用于一个测试环境的准备和销毁还原。
当测试用例每次执行之前需要准备测试环境,每次测试完成后还原测试环境,比如执行前连接数据库、打开浏览器等,执行完成后需要还原数据库、关闭浏览器等操作。这时候就可以启用testfixture。

  • setUp():准备环境,执行每个测试用例的前置条件;
  • tearDown():环境还原,执行每个测试用例的后置条件;
  • setUpClass():必须使用@claSSMethod装饰器,所有case执行的前置条件,只运行一次;
  • tearDownClass():必须使用@classmethod装饰器,所有case运行完后只运行一次;

例如:

# 重写TestCase的setUp() tearDown()方法:在每个测试方法执行前以及执行后各执行一次
def setUp(self):    # 钩子方法
    print("do something before test : prepare environment")
def tearDown(self): # 钩子方法
    print("do something after test : clean up ")

2、TestCase

类,unittest.TestCase
一个类class继承 unittest.TestCase,就是一个测试用例。一个TestCase的实例就是一个测试用例,就是一个完整的测试流程。
包括测试前环境准备setUp()|setUpClass()、执行代码run()、测试环境后的还原tearDown()|tearDownClass()。
继承自unittest.TestCase的类中,测试方法的名称要以test开头。且只会执行以test开头定义的方法(测试用例)。

例如:【先准备待测试的方法function.py】

#!/usr/bin/python3
# -*- coding:utf-8 -*-
def add(a,b):
    return a+b
def minus(a,b):
    return a-b
def multi(a,b):
    return a*b
def divide(a,b):
    return a/b

【测试脚本】:

import unittest
from A_UnitTest_basicDemo_ok.function import *

class TestFunc(unittest.TestCase):
    # 继承自unittest.TestCase
    # 重写TestCase的setUp()、tearDown()方法:在每个测试方法执行前以及执行后各执行一次
    def setUp(self):
        print("do something before test : prepare environment")

    def tearDown(self):
        print("do something after test : clean up ")
    
    # 测试方法均已test开头,否则是不被unittest识别的
    def test_add(self):
        print("add:")
        self.assertEqual(3,add(1,2))

    def test_minus(self):
        print("minus")
        self.assertEqual(3,minus(5,2))

    def test_multi(self):
        print("multi")
        self.assertEqual(6,multi(2 ,3))

    def test_divide(self):
        print("divide")
        self.assertEqual(2,divide(4,2))

if __name__ == "__main__":
    # 在main()中加verbosity参数,可以控制输出的错误报告的详细程度
    # verbosity=*:默认是1;设为0,则不输出每一个用例的执行结果;2-输出详细的执行结果
    unittest.main(verbosity=2)

或者也可以使用setUpClass() & tearDownClass()方法:

# 如果想在所有case执行之前准备一次测试环境,并在所有case执行结束后再清理环境
@classmethod
def setUpClass(cls):
    print("this setupclass() method only called once")
@classmethod
def tearDownClass(cls):
    print("this teardownclass() method only called once too")

【verbosity】
在测试用例文件的末尾加上如下代码:

if __name__ == "__main__":
    unittest.main(verbosity=2)  # 输出详细的错误报告

在unittest.main()中加参数verbosity可以控制错误报告的详细程度:默认为1。0,表示不输出每一个用例的执行结果;2表示详细的执行报告结果。

【执行结果】:输出到控制台

this setupclass() method only called once
test_add (__main__.TestFunc) ... ok
add:
test_divide (__main__.TestFunc) ... ok
divide
test_minus (__main__.TestFunc) ... ok
minus
test_multi (__main__.TestFunc) ... ok
multi

this teardownclass() method only called once too
----------------------------------------------------------------------
Ran 4 tests in 0.000s

OK

3、TestSuite

上述简单的测试会产生两个问题,可不可以控制test测试用例的执行顺序?若不想执行某个测试用例,有没有办法可以跳过?
对于执行顺序,默认按照test的 A-Z、a-z的方法执行。若要按自己编写的用例的先后关系执行,需要用到testSuite。
把多个测试用例集合起来,一起执行,就是testSuite。testsuite还可以包含testsuite。
一般通过addTest()或者addTests()向suite中添加。case的执行顺序与添加到Suite中的顺序是一致的。
例如:run_main.py

if __name__ == "__main__":
    suite = unittest.TestSuite()
# 定义list,按照list里的顺序执行测试用例
tests=[TestFunc("test_add"),TestFunc("test_minus"),TestFunc("test_multi"),TestFunc("test_divide")]
suite.addTests(tests)
runner = unittest.TextTestRunner(verbosity=2)
runner.run(suite)

TestSuite可以再包含testsuite,示例如下:

suite1 = module.TheTestSuite()
suite2=module.TheTestSuite()
alltests=unittest.TestSuite([suite1],[suite2])

跳过某个case:skip装饰器

若想让某个测试用例不执行,有没有办法呢?当然是有的,可以使用skip装饰器。
例如:

@unittest.skip("i don't want to run this case -> test_minus() ... ")
def test_minus(self):
    print("minus")
    self.assertEqual(3,minus(5,2))

加上“@unittest.skip()”后,执行看看,对比控制台的输出结果就可以明显看出区别了。
Skip装饰器有如下几种情况:
(1)skip():无条件跳过
@unittest.skip("i don't want to run this case. ")
(2)skipIf(condition,reason):如果condition为true,则 skip
@unittest.skipIf(condition,reason)
(3)skipUnless(condition,reason):如果condition为False,则skip
@unittest.skipUnless(condition,reason)

(4)还可以使用TestCase.skipTest(reason)。例如:

def test_divide(self):
    self.skipTest('do not run  test_divide()')
    print("divide")
    self.assertEqual(2,divide(4,2))

控制台输出(部分):

test_divide (__main__.TestFunc) ... skipped 'do not run  test_divide()'

4、TestLoader

TestLoadder用来加载TestCase到TestSuite中。
loadTestsFrom*()方法从各个地方寻找testcase,创建实例,然后addTestSuite,再返回一个TestSuite实例。
该类提供以下方法:

unittest.TestLoader().loadTestsFromTestCase(testCaseClass)
unittest.TestLoader().loadTestsFromModule(module)
unittest.TestLoader().loadTestsFromName(name,module=None)
unittest.TestLoader().loadTestsFromNames(names,module=None)
unittest.TestLoader().getTestCaseNames(testCaseclass)
unittest.TestLoader().discover()

TestLoader 之discover:
用discover()来加载测试多个测试用例,再用TextRunner类的run()方法去一次执行多个脚本的用例,达到批量执行的效果。
discover方法里面有三个参数:
-case_dir:这个是待执行用例的目录。
-pattern:这个是匹配脚本名称的规则,test*.py意思是匹配test开头的所有脚本。
-top_level_dir:这个是顶层目录的名称,一般默认等于None就行了。

TextTestRunner():执行测试用例。runner.run(test)会执行TestSuite、TestCase中的run(result)方法。
如下:run_main.py示例

import unittest
import os
# 用例的路径
case_path = os.path.join(os.getcwd(),"case")
# 报告存放的路径
report_path = os.path.join(os.getcwd(),"report")
def all_cases():
    discover= unittest.defaultTestLoader.discover(case_path,pattern="test*.py",top_level_dir=None)
    print(discover)
    return discover
if __name__ == "__main__":
    runner = unittest.TextTestRunner(verbosity=2)
    runner.run(all_cases())

5、生成测试报告

  • 生成TXT测试报告

代码示例:

if __name__ == "__main__":
    suite = unittest.TestSuite()
    # 生成.txt的测试报告(控制台的输出写入到文件中)
    suite.addTests(unittest.TestLoader().loadTestsFromTestCase(TestFunc))
    with open('UnittestTextReport.txt','a') as f:
        runner = unittest.TextTestRunner(stream=f,verbosity=2)
        runner.run(suite)

可以看到在目录下,生成了UnittestTextReport.txt文件。
但是txt格式的文件太过于简陋。我们可以借助与第三方提供的库来输出更加形象的html报告,也可以自定义输出自己想要格式的html格式的报告。

  • 生成HTML测试报告
  • 先下载HTMLTestRunner.py(注意Python的版本),
    Http://tungwaiyip.info/softwa... 。然后放在Python的Lib目录下;
  • 在run_main.py文件中加入:from HTMLTestRunner import HTMLTestRunner

HTMLTestRunner()方法有三个参数:
--stream:测试报告写入文件的存储区域
--title:测试报告的主题
--description:测试报告的描述

代码示例:

if __name__ == "__main__":
    suite = unittest.TestSuite()
    # 生成HTML格式的具体测试报告
    with open('HtmlReport.html','wb') as f:  # 在python3,要写成'wb' or 'wr'
        runner = HTMLTestRunner(stream=f,title='function test   
report',description='generated by HTMLTestRunner',verbosity=2)
        runner.run(suite)

三、代码示例

  • function.py
#!/usr/bin/python3
# -*- coding:utf-8 -*-
def add(a,b):
    return a+b
def minus(a,b):
    return a-b
def multi(a,b):
    return a*b
def divide(a,b):
    return a/b
  • Test_function.py
#!/usr/bin/python3
# -*- coding:utf-8 -*-
import unittest
from UnitTest_1.function import *  # from..import ... :要指定文件的路径

class TestFunc(unittest.TestCase): # unittest.TestCase
# 如果想在所有case执行之前准备一次测试环境,并在所有case执行结束后再清理环境
    @classmethod
    def setUpClass(cls):
        print("this setupclass() method only called once")
    @classmethod
    def tearDownClass(cls):
        print("this teardownclass() method only called once too")

    # 测试方法均已test开头,否则是不被unittest识别的
    def test_add(self):
        print("add:")
        self.assertEqual(3,add(1,2))
    def test_minus(self):
        print("minus")
        self.assertEqual(3,minus(5,2))
    # 如果想临时跳过某个case:skip装饰器
    @unittest.skip("i don't want to run this case. ")
    def test_multi(self):
        print("multi")
        self.assertEqual(6,multi(2,3))
    def test_divide(self):
        print("divide")
        self.assertEqual(2,divide(5,2))

if __name__ == "__main__":
    # 在main()中加verbosity参数,可以控制输出的错误报告的详细程度
    # verbosity=*:默认是1;设为0,则不输出每一个用例的执行结果;2-输出详细的执行结果
    unittest.main(verbosity=2)
  • Test_suite.py
#!/usr/bin/python3
# -*- coding:utf-8 -*-

import unittest
from UnitTest_1.test_function import TestFunc
from HTMLTestRunner import HTMLTestRunner
# 在Python3中已经没有 StringIO,所以引用的时候要注意
from io import StringIO

if __name__ == "__main__":
    suite = unittest.TestSuite()
    # 定义list,按照list里的顺序执行测试用例
    tests = [TestFunc("test_add"),TestFunc("test_minus"),TestFunc("test_multi"),TestFunc("test_divide")]
    suite.addTests(tests)
    '''
    runner = unittest.TextTestRunner(verbosity=2)
    runner.run(suite)
    '''
    
    # 生成.txt的测试报告(控制台的输出写入到文件中)
    '''
    suite.addTests(unittest.TestLoader().loadTestsFromTestCase(TestFunc))
    with open('UnittestTextReport.txt','a') as f:
        runner = unittest.TextTestRunner(stream=f,verbosity=2)
        runner.run(suite)
    '''

    # 生成HTML格式的具体测试报告
    with open('HtmlReport.html','wb') as f:  # 在python3,要写成'wb' or 'wr'
        runner = HTMLTestRunner(stream=f,title='function test report',description='generated by 
                    HTMLTestRunner',verbosity=2)
        runner.run(suite)

题外话:duang~ duang~ duang~ 周末啦~
脑壳有点疼 肥家肥家 我爱工作 工作爱我


❤ thanks for watching, keep on updating...

--结束END--

本文标题: 【自动化测试】Python - uni

本文链接: https://www.lsjlt.com/news/193310.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 【自动化测试】Python - uni
    一、测试模型 下面这部分来自于某书籍资料,拿过来,按需参考一下: 测试模型(1)线性测试1、概念:通过录制或编写对应应用程序的操作步骤产生的线性脚本。单纯的来模拟用户完整的操作场景。(操作,重复操作,数据)都混合在一起。2、优点:每个...
    99+
    2023-01-31
    测试 Python uni
  • Python自动化测试
    第一章 Python自带的UnitTest单元测试框架 一、什么是框架 框架是由大佬开发或者专业的研发团队研发的技术骨架,框架是一个半成品,框架是对常用的功能,基础的代码进行封装的一个工具,这个工具对...
    99+
    2023-09-04
    python 单元测试 junit
  • 【python+appium】自动化测试
    python+appium自动化测试系列就要告一段落了,本篇博客咱们做个小结。 首先想要说明一下,APP自动化测试可能很多公司不用,但也是大部分自动化测试工程师、高级测试工程师岗位招聘信息上要求的,所以为了更好的待遇,我们还是需要花时间去掌...
    99+
    2023-08-31
    python appium 开发语言 postman jmeter
  • python之自动化测试
    功能: 在ubuntu上面,通过shell脚本打开 VirtualBox(windows xp),并调用XP里面的python脚本,来打开一些windows上面的软件,并做模拟操作,完成之后关闭VirtualBox(windows xp)...
    99+
    2023-01-31
    测试 python
  • selenium+Python自动化测试
    Python 3.3版本# coding = utf-8from selenium import webdriverdriver = webdriver.Chrome()driver.get('http://www.baidu.com')p...
    99+
    2023-01-31
    测试 selenium Python
  • python selenium自动化测试
    python selenium自动化测试项目实战,Selenium3自动化测试,Python3 测试21套高级软件测试,性能测试,功能测试,自动化测试,接口测试,移动端测试,手机测试,WEB测试,***测试,测试用例设计,黑盒测试,白盒测试...
    99+
    2023-01-31
    测试 python selenium
  • Python自动化测试如何自动生成测试用例
    本篇文章给大家分享的是有关Python自动化测试如何自动生成测试用例,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。今天,陕西优就业小优整理了一些技术类干货知识,学习软件测试的小...
    99+
    2023-06-02
  • selenium与python自动化测试
    将一些必须必要条件准备好 1,安装chorme浏览器 1,安装依赖 sudo apt-get install libxss1 libappindicator1 libindicator7 2,下载google安装包 wget https:...
    99+
    2023-01-30
    测试 selenium python
  • 〖Python接口自动化测试实战篇④〗- 接口自动化测试详解
    订阅 Python全栈白宝书-零基础入门篇 可报销!白嫖入口-请点击我。推荐他人订阅,可获取扣除平台费用后的35%收益,文末名片加V! 说明:该文属于 Python全栈白宝书专栏,免费阶段订...
    99+
    2023-09-04
    自动化 python自动化测试实战 自动化测试 接口测试 接口自动化测试
  • Python 测试框架:自动化测试的革命
    随着软件开发的复杂度不断增加,自动化测试已成为确保应用程序质量和可靠性的关键步骤。Python 因其灵活性、可扩展性和广泛的库而成为自动化测试的首选语言之一。本文将深入探讨 Python 测试框架,了解它们如何彻底改变了自动化测试的格局。...
    99+
    2024-04-02
  • Selenium+Python自动化测试入门
    目录Selenium介绍环境搭建Python安装安装Pycharmselenium安装WebDriver安装selemium的基本使用元素定位多窗口结束语Selenium介绍 &nb...
    99+
    2024-04-02
  • Python 测试框架:自动化测试的利器
    Unittest Unittest 是 Python 内置的单元测试框架。它提供了一组全面的断言方法,用于比较实际结果和预期结果。Unittest 还可以轻松分组和组织测试用例,并生成详细的测试报告。 Pytest Pytest 是一个功...
    99+
    2024-04-02
  • python实现hive自动化测试
    本程序主要实现hive权限测试。系统中有管理员用户single和测试用户test。在路径/home/test/下,将用例和预期结果写在xml文件中。        执 行过程:kinit single用户,beeline -u -e登录并执...
    99+
    2023-01-31
    测试 python hive
  • python接口自动化测试(一)
    一.既然我们有这些的接口测试工具,为什么要做接口做自动化 敏捷开发,接口一般数量很大,团队实现接口测试,版本控制。 2、功能太死板,有些接口完全无法实现(复杂的加密接口,签名接口等) 3、接口项目当中...
    99+
    2023-09-01
    python 开发语言
  • 30道python自动化测试面试题
    文章目录 1、什么项目适合做自动化测试?2、什么是 PO 模式?3、PO 模式的封装原则有哪些?4、 Python 中 *args 和 **kwargs 的作用?5、Python 中的垃圾回收...
    99+
    2023-09-04
    python 面试 开发语言
  • python web自动化测试,入门篇
    自动化测试入门篇 本次实现自动化是用python语言进行实现,所以需要有一点python基础,其实python还是比较简单入门的,下面开始。 安装python,我安装的是最新版本的python,传送门https://www.python....
    99+
    2023-01-31
    测试 入门篇 python
  • Python进行自动化测试工具
    在自动化测试里Python用途很广,但是市面上测试工具不是很多,这里主要介绍的是一些Python测试的框架1、单元测试a、unittest、doctest:Python自带的单元测试框架b、pyunit:Junit的Python版本c、py...
    99+
    2023-01-31
    测试工具 Python
  • Python怎么实现自动化测试
    本篇文章为大家展示了Python怎么实现自动化测试,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Python的优点有哪些1、简单易用,与C/C++、Java、C# 等传统语言相比,Python对代码...
    99+
    2023-06-14
  • python自动化测试之Selenium详解
    目录1.安装2.基础操作2.1 声明浏览器对象2.2 访问网页2.3 查找单个节点2.4 查找多个节点3.等待3.1 显式等待3.2 隐式等待总结1.安装 完成自动化测试,需要配置三...
    99+
    2024-04-02
  • Python 测试框架:释放自动化测试的力量
    Unittest:内建的可靠解决方案 Unittest 是 Python 内置的测试框架,提供了一组用于编写和运行单元测试的类和函数。它非常简单易用,并与 Python 标准库完美集成。单元测试可用于测试单个函数或类,有助于确保代码的逻辑...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作