单元测试库(UnitTest)实现了我们在开发代码过程中实际值和预期值进行比较等功能,使用起来很方便。UnitTest作为一种单元测试框架,其思想来源于JUnit,跟目前市场上主流的一些测试框架有很多相似之处。
UnitTest 工作流中核心的四大组件简介:
(1)Test Fixture 是指在执行测试之前的准备工作,比如数据清理工作、创建临时数据库、目录,以及开启某些服务进程等。
(2)Test Case 是最小的测试单元,具有独立性。主要检测输出结果是否满足期望,这些结果基于一系列特定的输入。UnitTest 提供了一个基类‘TestCase’用来创建新的 TestCases。
(3)Test Suite 可以简单理解为Test Case的集合,主要用于对于集成管理要在一起执行的测试用例。
(4)Test Runner 也是UnitTest的一个重要组件,主要用于协调测试的执行并提供结果输出给用户参考。
UnitTest 提供了很丰富的工具集来创建和运行单元测试。
(1)所有的测试用例类要继承基本类 unittest.TestCase。Python语法规定,父类要写在小括号内,如:Add(unittest.TestCase)。
(2)unittest.main() 的作用是使一个单元测试模块变为可直接运行的测试脚本。
main()方法使用TestLoader类来搜索所有包含在该模块中以‘test’命名开头的测试方法,并自动执行他们。执行方法的默认顺序是,根据ASCII码的顺序加载测试用例,数字与字母的顺序为0-9,A-Z,a-z。因此A开头的方法会优先执行,a开头的方法会后执行。
简单的单元测试练习代码:
# coding = utf-8
import unittest
class Add(unittest.TestCase):
def setUp(self) -> None:
pass
def test_01(self):
'''
判断2与2是否相等,预期结果为相等
:return:
'''
self.assertEqual(2, 2)
def test_02(self):
'''
判断'selenium'与'appium'是否相等,预期结果为不相等
:return:
'''
self.assertEqual('selenium', 'appium')
def test_03(self):
'''
判断'se'与'se'是否是同样的字符串,预期结果是相同的
:return:
'''
self.assertEqual('se', 'se')
def tearDown(self) -> None:
pass
if __name__ == '__main__':
unittest.main()
用UnitTest运行一个webdriver的测试用例,业务场景是:百度首页->输入python并搜索->检查返回页面中是否有python字符串。
代码如下:
# coding = utf-8
import unittest
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
class BaiDu(unittest.TestCase):
def setUp(self) -> None:
self.driver = webdriver.Chrome()
def testBaidu(self):
self.driver.get('https://www.baidu.com/')
self.driver.find_element(By.ID, 'kw').clear()
self.driver.find_element(By.ID, 'kw').send_keys('python')
self.driver.find_element(By.ID, 'su').click()
time.sleep(5)
print(self.driver.page_source)
assert 'python' in self.driver.page_source
def tearDown(self) -> None:
self.driver.quit()
if __name__ == '__main__':
unittest.main()