unittest最详细的解说
转自: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()