转自:http://www.imooc.com/article/257230

一、什么是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为假

断言肯定发生异常,如果没发生异常,则为测试失败。

参数1为异常,参数二为抛出异常的调用对象,剩余参数为传递给可调用对象的参数。

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: PyCharmimport timeimport unittestfrom selenium import webdriverfrom selenium.webdriver.support import expected_conditions as ECclass 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()

unittest最详细的解说的更多相关文章

  1. 详细的解说public,protected,Default和private的权限问题

    详细的解说public,protected,Default和private的权限问题 让人更好的了解public,protected,Default和private他们之间的权限问题,我会做一个直观的 ...

  2. Nginx 怎么给一台服务器,配置两个域名?详细的解说+截图教程

    一.        环境.条件准备 一台云服务器(我的是腾讯的centos7) 至少两个域名.(我的是simuhunluo.xyz和simuhunluo.top.这两个域名之间没有任何关系,我是在阿里 ...

  3. unittest 是什么?怎么用?

    unittest单元测试框架详解 https://www.cnblogs.com/fighter007/p/8245063.html unittest最详细的解说 https://www.cnblog ...

  4. DosBox 的 DOSBOX.CONF 的详细配置说

    1.首先下载 DOSbox 0.72 版.   2.下载完毕,开始安装.安装到任意目录均可.安装完毕会在开始菜单生成程序组,DOSBox.conf 文件是 DOSbox 的配置文件,保持默认配置就可 ...

  5. 算法与数据结构(十三) 冒泡排序、插入排序、希尔排序、选择排序(Swift3.0版)

    本篇博客中的代码实现依然采用Swift3.0来实现.在前几篇博客连续的介绍了关于查找的相关内容, 大约包括线性数据结构的顺序查找.折半查找.插值查找.Fibonacci查找,还包括数结构的二叉排序树以 ...

  6. js文件中函数前加分号和感叹号是什么意思?

    本文转自:http://blog.csdn.net/h_o_w_e/article/details/51388500 !function(){}();   !有什么用? 从语法上来开,JavaScri ...

  7. 再说表单验证,在Web Api中使用ModelState进行接口参数验证

    写在前面 上篇文章中说到了表单验证的问题,然后尝试了一下用扩展方法实现链式编程,评论区大家讨论的非常激烈也推荐了一些很强大的验证插件.其中一位园友提到了说可以使用MVC的ModelState,因为之前 ...

  8. 续关于C#的微信开发的入门记录一

    前几天写了一篇博客<关于C#的微信开发的入门记录一>,原文地址:http://www.cnblogs.com/zhankui/p/4515905.html,现在继续完善: 目前很多小伙伴都 ...

  9. 符合我公司GIS开源解决方案的探讨

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.前言 这一周,我对GIS开源解决方案中涉及到的开源软件以及相关技术 ...

随机推荐

  1. 将具有特殊class名img标签替换成[img][/img]标签--javascript正则表达式实践

    在项目中,可能有时候需要将一些特殊的东西加一个特别的属性,或者一个特殊的Class.如下: <!-- 第一种写法 --> <img src="abc.jpg" f ...

  2. 在 Android Studio 2.2 中愉快地使用 C/C++

    转载请注明出处:http://blog.csdn.net/wl9739/article/details/52607010 注:官网上面的技术文章也在不断地汉化中,只是进度有点慢.在我翻译本篇文章的时候 ...

  3. dcm4che tools 之dicomdir

    1.在dcm4che-3.3.7目录下的bin文件夹下运行命令行窗口 运行以下命令: dcmdir -c E:\TEMP\DICOMDIR E:\TEMP\04E439CE 为E:\TEMP\04E4 ...

  4. python学习:两个py文件间的函数调用

    本例子是测试一些数据分析模型的R值,R值越接近1,表明该模型越适合分析该数据集. 本例子是在集成开发环境Aptana Studio 3 中创建 一个dataAnaly ,然后创建modelTest.p ...

  5. 纯CSS实现多行文字垂直居中几种方法解析

    场景:父元素 高度固定,如何使其中的文字垂直居中? 1.table布局: 利用display:table+display:table-cell的方法 <!DOCTYPE html> < ...

  6. Activex打包于发布完整版---微软证书制作

    众所周知,Activex组件没有进行有效的签名,在IE上无法安装的,除非你让用户手工开启“接收任何未签名的ActiveX”,这个很明显不现实.而组件签名需要证书,证书从哪里来,你可以选择付1000到3 ...

  7. Java死锁举例

    死锁: 在多线程竞争使用共享资源的情况下.就有可能出现死锁的情况.比方,当一个线程等待还有一个线程所持有的锁时.那个线程又可能在等待第一个线程所持有的锁.此时.这两个线程会陷入无休止的相互等待状态.这 ...

  8. 倍福TwinCAT(贝福Beckhoff)常见问题(FAQ)-如何使用随机数DRAND模块

    DRAND函数可以产生0-1的随机浮点数   DRAND的输入Seed有什么意义?     更多教学视频和资料下载,欢迎关注以下信息: 我的优酷空间: http://i.youku.com/aceta ...

  9. vb.net小试三层架构

    在对三层架构有了初步了解后,用vb.net做了一个小的程序,真的很小,仅仅是为了体现一下三层之间机制.下面是我设计的操作界面: 还有程序集和类的分布情况, 接下来是数据的设计,数据库用到的是SQL S ...

  10. mysql导入数据乱码的解决

    #mysql -uroot -p -hlocalhost --default-character-set=utf8; mysql>use db_name; mysql>source /ho ...