返回顶部
首页 > 资讯 > 后端开发 > Python >细说unittest-1
  • 846
分享到

细说unittest-1

unittest 2023-01-31 00:01:51 846人浏览 薄情痞子

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

摘要

转自:https://www.jianshu.com/p/6c07be6d61dc   一、什么是unittest unittest是python单元测试框架,类似于JUnit框架。 unittest中有4个重要的概念:test fixt

转自:https://www.jianshu.com/p/6c07be6d61dc

 

一、什么是unittest

unittest是python单元测试框架,类似于JUnit框架。

unittest中有4个重要的概念:test fixture, test case, test suite, test runner

Testcase:

一个TestCase的实例就是一个测试用例。什么是测试用例呢?就是一个完整的测试流程,包括测试前准备环境的搭建(setUp),执行测试代码 (run),以及测试后环境的还原(tearDown)。元测试(unit test)的本质也就在这里,一个测试用例是一个完整的测试单元,通过运行这个测试单元,可以对某一个问题进行验证。

Test suite:

多个测试用例集合在一起,就是TestSuite,而且TestSuite也可以嵌套TestSuite。

Test runner:

是来执行测试用例的,其中的run(test)会执行TestSuite/TestCase中的run(result)方法。

TestLoader:

是用来加载TestCase到TestSuite中的,其中有几个loadTestsFrom__()方法,就是从各个地方寻找TestCase,创建它们的实例,然后add到TestSuite中,再返回一个TestSuite实例。

Test fixture:

对一个测试用例环境的搭建和销毁,是一个fixture,通过覆盖 TestCase的setUp()和tearDown()方法来实现。这个有什么用呢?比如说在这个测试用例中需要访问数据库,那么可以在setUp() 中建立数据库连接以及进行一些初始化,在tearDown()中清除在数据库中产生的数据,然后关闭连接。注意tearDown的过程很重要,要为以后的 TestCase留下一个干净的环境。关于fixture,还有一个专门的库函数叫做fixtures,功能更加强大。

使用unittest编写Python的单元测试代码,包括如下几个步骤:

1、编写一个python类,继承 unittest模块中的TestCase类,这就是一个测试类

2、在上面编写的测试类中定义测试方法(这个就是指的测试用例),每个方法的方法名要求以 test 打头,没有额外的参数。 在该测试方法中 调用被测试代码,校验测试结果,TestCase类中提供了很多标准的校验方法,如 最常见的assertEqual。

3、执行 unittest.main() ,该函数会负责运行测试,它会实例化所有TestCase的子类,并运行其中所有以test打头的方法。

二、简单用法

unittest是python自带的一个单元测试框架,类似于java的junit,基本结构是类似的。基本用法如下:

1.用import unittest导入unittest模块

2.定义一个继承自unittest.TestCase的测试用例类,如class xxx(unittest.TestCase):

3.定义setUp和tearDown,这两个方法与junit相同,即如果定义了则会在每个测试case执行前先执行setUp方法,执行完毕后执行tearDown方法。

4.定义测试用例,名字以test开头,unittest会自动将test开头的方法放入测试用例集中。

5.一个测试用例应该只测试一个方面,测试目的和测试内容应很明确。主要是调用assertEqual、assertRaises等断言方法判断程序执行结果和预期值是否相符。

6.调用unittest.main()启动测试

7.如果测试未通过,则会显示e,并给出具体的错误(此处为程序问题导致)。如果测试失败则显示为f,测试通过为.,如有多个testcase,则结果依次显示。

三、unittest模块的常用方法

assertEqual(a, b) a == b

assertNotEqual(a, b) a != b

assertTrue(x) bool(x) is True

assertFalse(x) bool(x) is False

assertIs(a, b) a is b

assertIsNot(a, b) a is not b

assertIsNone(x) x is None

assertIsNotNone(x) x is not None

assertIn(a, b) a in b

assertNotIn(a, b) a not in b

assertIsInstance(a, b) isinstance(a, b)

assertNotIsInstance(a, b) not isinstance(a, b)

官网案例:

 

image

 

类TestSequenceFunctions继承自unittest.TestCase,在类中定义了3个testcase。

unittest.main()调用Testloader加载这3个testcase到Testsuite,再用Testrunner运行testsuite,生成Testresult。

从output中可以看出,执行每个testcase之前都会先setUp()初始化,执行完毕之后tearDown()清理环境。

四、unittest主要常用函数

python的unittest模块提供了一个测试框架,只要我们写一个继承unittest.TestCase的类,类中用setUp做初始化,用tearDown做清理。

主要用到的函数有:

failedinfo表示不成立打印信息failedinfo,为可选参数

self.fail([msg])会无条件的导致测试失败,不推荐使用。

self.assertEqual(value1, value2, failedinfo) # 断言value1 == value2

self.assertTrue(表达式, failedinfo) # 断言value为真

self.assertFalse(表达式, failedinfo) # 断言value为假

self.assertRaises(ValueError, self.widget.resize, -1, -1)

调用时机的加self,如self.assertEqual(self.seq, range(10)),self.assertTrue(value > 100)

五、unittest网易邮箱登录案例

1.打开网易邮箱,写一个简单的登录;

2.判断title完全等于期望结果;

 

 

image

 

六、参考代码

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Author  : Ailie
# @File    : mailLogin.py
# @Software: PyCharm
import time
import unittest
from selenium import WEBdriver
from selenium.webdriver.support import expected_conditions as EC
class mailLogin(unittest.TestCase):
    def setUp(self):
        url = 'Https://mail.yeah.net/'
        self.browser = webdriver.Firefox()
        self.browser.get(url)
        time.sleep(5)

    def test_login_01(self):
        '''
        用户名、密码为空
        '''
        self.browser.switch_to.frame("x-URS-iframe")
        self.browser.find_element_by_name('email').send_keys('')
        self.browser.find_element_by_name('passWord').send_keys('')
        self.browser.find_element_by_id('dologin').click()
        self.browser.switch_to.default_content()
        time.sleep(3)
        name = self.browser.find_element_by_id('spnUid')
        if name == 'sanzang520@yeah.net':
            print('登录成功')
        else:
            print('登陆失败')

    def test_login_02(self):
        '''
        用户名正确、密码为错误
        '''
        self.browser.switch_to.frame("x-URS-iframe")
        self.browser.find_element_by_name('email').send_keys('sanzang520')
        self.browser.find_element_by_name('password').send_keys('xxx')
        self.browser.find_element_by_id('dologin').click()
        self.browser.switch_to.default_content()
        time.sleep(3)
        name = self.browser.find_element_by_id('spnUid')
        if name == 'sanzang520@yeah.net':
            print('登录成功')
        else:
            print('登陆失败')

    def test_login_03(self):
        '''
        用户名、密码正确
        '''
        self.browser.switch_to.frame("x-URS-iframe")
        self.browser.find_element_by_name('email').send_keys('sanzang520')
        self.browser.find_element_by_name('password').send_keys('xxx')
        self.browser.find_element_by_id('dologin').click()
        self.browser.switch_to.default_content()
        time.sleep(3)
        name = self.browser.find_element_by_id('spnUid')
        if name == 'sanzang520@yeah.net':
            print('登录成功')
        else:
            print('登陆失败')

    def tearDown(self):
        self.browser.quit()

if __name__ == "__main__":
    unittest.main()

--结束END--

本文标题: 细说unittest-1

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

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

猜你喜欢
  • 细说unittest-1
    转自:https://www.jianshu.com/p/6c07be6d61dc   一、什么是unittest unittest是Python单元测试框架,类似于JUnit框架。 unittest中有4个重要的概念:test fixt...
    99+
    2023-01-31
    unittest
  • 细说unittest-2
    一、unittest模块官方文档: https://docs.python.org/3/library/unittest.html 二、一张图看懂unittest: 三、Unittest主要方法属性: 1.unittest.TestCa...
    99+
    2023-01-31
    unittest
  • java中1+1d/5和1+1/5的区别说明
    目录java 1+1d/5和1+1/5的区别主要区别就是数据类型不同计算1+1/2!+1/3!+...+1/20!之和java 1+1d/5和1+1/5的区别 主要区别就是数据类型不...
    99+
    2024-04-02
  • NO.1 Android 从$AppViewScreen说起
    NO.1 Android 从$AppViewScreen说起 零蚀 全埋点的认识 全埋点的理解 全埋点是指工程师只需要使用少量代码,或者不使用...
    99+
    2022-06-06
    Android
  • springBoot server.port=-1的含义说明
    springBoot server.port=-1的含义 今天遇到这种新奇的写法,项目是可以正常启动的。 然而http的端口有范围:1~65535。-1是访问不了的 而且只要是负数...
    99+
    2024-04-02
  • 细说mysql索引
    https://www.cnblogs.com/chenshishuo/p/5030029.html   本文从如何建立mysql索引以及介绍mysql的索引类型,再讲mysql索引的利与弊,以及建立索引时需要注意的地方 首先:先...
    99+
    2016-11-18
    细说mysql索引
  • 细说document.ready和window.onload
    document.ready是jQuery提供的一个函数,用于在文档加载完成后执行一些代码。它相当于JavaScript中的wind...
    99+
    2023-09-23
    细说
  • XXL-JOB详细说明
    XXL-JOB 常见任务调度 单机:Timer、ExectorService、spring@scheduled 分布式:xxl-job、quartz、elastic-job 原生定时任务的先天缺陷 ...
    99+
    2023-09-01
    spring cloud spring boot java spring Powered by 金山文档
  • mysqldump参数详细说明
    参数说明 --all-databases , -A 导出全部数据库。 mysqldump -uroot -p --all-databases --all-tablespaces , -Y 导出全部表空间。 mysqldump...
    99+
    2020-08-04
    mysqldump参数详细说明 数据库入门 数据库基础教程 数据库 mysql
  • 细说mysql replace into用法
    replace语句在一般的情况下和insert差不多,但是如果表中存在primary 或者unique索引的时候,如果插入的数据和原来的primary key或者unique相同的时候,会删除原来的数据,然...
    99+
    2022-05-11
    mysql replace into
  • mysqldump参数详细说明
    Mysqldump参数大全1、mysqldump备份:mysqldump -u用户名 -p密码 -h主机 数据库 -w “sql条件” ...
    99+
    2024-04-02
  • LoadLibrary函数详细说明
    LoadLibrary函数是Windows操作系统中的一个函数,用于加载一个动态链接库(DLL)文件到当前进程的地址空间中。该函数的...
    99+
    2023-09-09
    LoadLibrary
  • 详细说明增删改查
    2. 修改表(重点重点)a) 修改表名ALTER TABLE 表名 RENAME TO 新表名b) 修改字段的数据类型ALTER TABLE 表名 MODIFY 字段名 &nb...
    99+
    2024-04-02
  • mybatis-config详细配置说明
    <xml version="1.0" encoding="utf-8"> <!DOCTYPE configuration PUBLIC "...
    99+
    2024-04-02
  • Go语言Handler详细说明
    Multiplexer根据URL将请求路由给指定的Handler。Handler用于处理请求并给予响应。更严格地说,用来读取请求体、并将请求对应的响应字段(respones head...
    99+
    2024-04-02
  • C++关于/2和>>1的区别说明
    目录/2和>>1的区别1.操作对象类型不同2.运算效率不同3.优先级不同C++ <<和>>的意思<<是左移运算符的意思>>...
    99+
    2024-04-02
  • 细说Spring——AOP详解(AOP概览)
    一、对AOP的初印象首先先给出一段比较专业的术语(来自百度):在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一 维护的一种技术。AOP是OO...
    99+
    2021-10-23
    java教程 Spring
  • 【java面向对象】细说接口
    接口的概念接口体现了事物的扩展性。举个具体例子,我们知道,猫本来不会跳高,但是当Cat类实现了Jumpping接口,那猫就能跳高了。也就是说“猫”这个事物扩展了“跳高”这个功能。接口的使用 定义一个接口类-Jumpping实现类Cat...
    99+
    2019-11-28
    java教程 java
  • dedecms日期调用详细说明
    dedecms日期调用方法在首页,列表页,和内容页都有规定的样式,调用起来很方便! dedecms首页时间标签: 1、10-21样式 ([field:pubdatefunction='strftime("%m-...
    99+
    2022-06-12
    dedecms日期 调用
  • Redis核心原理详细解说
    目录1、Redis为什么这么快2、Redis网络模型3、Redis数据结构4、Redis持久化RDB快照(snapshot)AOF(append-only file)RDB与AOF区别Redis数据备份策略5、Redis...
    99+
    2022-07-21
    Redis核心原理 Redis原理
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作