一、简介
Python单元测试框架unittest,有时被称为“PyUnit”。PyUnit 是 xUnit 体系的一个成员,xUnit 是众多测试框架的总称,PyUnit 主要用于进行白盒测试和回归测试,与JUnit有很多相似的地方。
二、认识Unittest单元测试框架
1.Test Fixture :就是setUp()和tearDown(),对一个测试用例环境的搭建和销毁
2.Test Case:一个Test Case就是一个测试用例
3.Test Suite :是一个测试用例集合
三、PyUnit (unittest) 的基本用法
被测方法,简单的加减乘除
def add(a, b):
return a + b
def sub(a, b):
return a - b
def multi(a, b):
return a * b
def div(a, b):
if b == 0:
raise ValueError("invalid value:0")
return a / b
测试用例的代码:
- 测试方法没有返回值。
- 测试方法不应该有任何参数。
- 测试方法应以test 开头。
import unittest
import Calculation
class TestCalculation(unittest.TestCase): #单元测试类必须继承 unittest.TestCase
def setUp(self):
pass
def tearDown(self):
pass
def testAdd(self):
self.assertEqual(3,Calculation.add(1,2))
def testSub(self):
self.assertTrue(Calculation.sub(3,2) == 1)
def testMulti(self):
self.assertFalse(Calculation.multi(3,3) == 5)
def testDiv(self):
with self.assertRaises(ValueError):
Calculation.div(3,0)
if __name__ == '__main__':
unittest.main()
测试结果
常见方法
方法 | 检查一下 |
---|---|
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) |
异常、错误、警告和日志相关的断言方法
断言方法 | 检查条件 |
---|---|
assertRaises(exc, fun, *args, **kwds) | fun(*args, **kwds) 引发 exc 异常 |
assertRaisesRegex(exc, r, fun, *args, **kwds) | fun(*args, **kwds) 引发 exc 异常,且异常信息匹配 r 正则表达式 |
assertWarns(warn, fun, *args, **kwds) | fun(*args, **kwds) 引发 warn 警告 |
assertWamsRegex(warn, r, fun, *args, **kwds) | fun(*args, **kwds) 引发 warn 警告,且警告信息匹配 r 正则表达式 |
assertLogs(logger, level) | With 语句块使用日志器生成 level 级别的日志 |
用于完成某种特定检查的断言方法
断言方法 | 检查条件 |
---|---|
assertAlmostEqual(a, b) | round(a-b, 7) == 0 |
assertNotAlmostEqual(a, b) | round(a-b, 7) != 0 |
assertGreater(a, b) | a > b |
assertGreaterEqual(a, b) | a >= b |
assertLess(a, b) | a < b |
assertLessEqual(a, b) | a <= b |
assertRegex(s, r) | r.search(s) |
assertNotRegex(s, r) | not r.search(s) |
assertCountEqual(a, b) | a、b 两个序列包含的元素相同,不管元素出现的顺序如何 |
针对特定类型的断言方法
断言方法 | 用于比较的类型 |
---|---|
assertMultiLineEqual(a, b) | 字符串(string) |
assertSequenceEqual(a, b) | 序列(sequence) |
assertListEqual(a, b) | 列表(list) |
assertTupleEqual(a, b) | 元组(tuple) |
assertSetEqual(a, b) | 集合(set 或 frozenset) |
assertDictEqual(a, b) | 字典(dict) |
python官方文档:https://docs.python.org/3.5/library/unittest.html
四、通过testsuite加载所有的被测对象
import unittest
import Calculation
class TestCase1(unittest.TestCase):
def testAdd(self):
self.assertEqual(5,Calculation.add(2,3))
class TestCase2(unittest.TestCase):
def testMulti(self):
self.assertEqual(10,Calculation.multi(2,5))
if __name__ == '__main__':
suite1 = unittest.TestLoader().loadTestsFromTestCase(TestCase1)
suite2 = unittest.TestLoader().loadTestsFromTestCase(TestCase2)
suite = unittest.TestSuite([suite1,suite2])
unittest.TextTestRunner(verbosity=2).run(suite)
测试结果:
五、python+selenium+unittest单元测试
1.测试说明
测试LoadRunner中Web Tours的登录功能
序号 | 测试标题 | 测试用例 |
---|---|---|
1 | 测试用户名为空,密码正确 | username:’’ ;password:bean |
2 | 测试用户名错误 | username:jo ;password:bean |
3 | 测试密码为空,用户名正确 | username:jojo ;password:’’ |
4 | 测试密码错误 | username:jojo;password:bean1 |
5 | 测试正确登录 | username:jojo ;password:bean |
2.代码示例
from selenium import webdriver
import unittest
class loginTest(unittest.TestCase):
def setUp(self):
self.url='http://localhost:1080/WebTours/'
self.driver=webdriver.Chrome()
self.driver.maximize_window()
self.driver.implicitly_wait(30)#隐性等待30秒
self.driver.get(self.url)
def tearDown(self):
self.driver.quit()
#登录功能
def login(self,username,passwrod):
self.driver.switch_to.frame('body')
self.driver.switch_to.frame('navbar')
self.driver.find_element_by_xpath('/html/body/form/table/tbody/tr[4]/td[2]/input').send_keys(username)
self.driver.find_element_by_xpath('/html/body/form/table/tbody/tr[6]/td[2]/input').send_keys(passwrod)
self.driver.find_element_by_xpath('/html/body/form/table/tbody/tr[8]/td[2]/input').click()
# 测试用户名为空
def test_username_null(self):
self.login('','bean')
self.driver.switch_to.parent_frame()
self.driver.switch_to.frame('info')
tip=self.driver.find_element_by_xpath('/html/body/blockquote/center/h3/font').text
self.assertEqual(tip,'Web Tours Error - Null Username')
# 测试用户名错误
def test_username_error(self):
self.login('jo','bean')
self.driver.switch_to.parent_frame()
self.driver.switch_to.frame('info')
tip=self.driver.find_element_by_xpath('/html/body/blockquote/center/h3/font').text
self.assertEqual(tip,'Web Tours Error - Incorrect Username')
# 测试密码为空
def test_password_null(self):
self.login('jojo', '')
self.driver.switch_to.parent_frame()
self.driver.switch_to.frame('info')
tip = self.driver.find_element_by_xpath('/html/body/blockquote/center/h3/font').text
self.assertEqual(tip, 'Web Tours Error - Null Password')
# 测试密码错误
def test_password_error(self):
self.login('jojo', 'bean1')
self.driver.switch_to.parent_frame()
self.driver.switch_to.frame('info')
tip = self.driver.find_element_by_xpath('/html/body/blockquote/center/h3/font').text
self.assertEqual(tip, 'Web Tours Error - Incorrect Password')
# 测试正确登录
def test_login_su(self):
self.login('jojo', 'bean')
self.driver.switch_to.parent_frame()
self.driver.switch_to.frame('info')
tip = self.driver.find_element_by_xpath('/html/body/blockquote/b').text
self.assertEqual(tip, 'jojo')
if __name__=='__main__':
unittest.main()
运行结果