接⼝测试基础-unittest最详细的解说
转⾃:www.imooc/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
iframe参数传递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, size, -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 mailLo def setUp(self):
url = 'ah/'
self.browser = webdriver.Firefox()
(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':
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':
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':
print('登录成功') else:
print('登陆失败') def tearDown(self):
self.browser.quit()if __name__ == "__main__":
unittest.main()
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论