Python单元测试:从零掌握unittest框架

Python3.8

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本


一、selenium IDE 安装

访问 selenium 下载页面:http://docs.seleniumhq.org/download/

二、引入 unittest 框架

1.引入库

代码如下:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import Select
from selenium.common.exceptions import NoSuchElementException
import unittest, time, re
class Baidu(unittest.TestCase):
	def setUp(self):
		self.driver = webdriver.Firefox()
		self.driver.implicitly_wait(30)
		self.base_url = "http://www.baidu.com/" self.verificationErrors = []
		self.accept_next_alert = True
	def test_baidu(self):
		driver = self.driver
		driver.get(self.base_url + "/")
		driver.find_element_by_id("kw").send_keys("selenium webdriver")
		driver.find_element_by_id("su").click()
		driver.close()
	def is_element_present(self, how, what):
		try: self.driver.find_element(by=how, value=what)
		except NoSuchElementException, e: return False
		return True
	def is_alert_present(self):
		try: self.driver.switch_to_alert()
		except NoAlertPresentException, e: return False
		return True
	def close_alert_and_get_its_text(self):
		try:
			alert = self.driver.switch_to_alert()
			alert_text = alert.text
			if self.accept_next_alert:
				alert.accept()
			else:
				alert.dismiss()
			return alert_text
		finally: self.accept_next_alert = True
	def tearDown(self):
		self.driver.quit()
		self.assertEqual([], self.verificationErrors)
if __name__ == "__main__":
unittest.main()

setUp 用于设置初始化的部分,在测试用例执行前,这个方法中的函数将先被调用。这里将浏览器的调用和 URL 的访问放到初始化部分。
tearDown 方法在每个测试方法执行后调用,这个地方做所有测试用例执行完成的清理工作,如退出浏览器等。

init()方法在类的一个对象被建立时,马上运行。这个方法可以用来对你的对象做一些你希望的初始化。

getSize()
在面向对象的编程语言中都会有类的概念,类具有封装性;在 C++ 、java 等语言中通过 private(私有)、protected(保护)、public(公有)等修饰符来限定访问权限。在 Python 中没有显式的 private 和 public限定符,如果要将一个方法声明为 private 的,只要在方法名前面加上“ __ ”即可。所以,我们前面定义的__init__() 方法是一个私有的方法,不能直接被外部使用。那么如何才能使用,类中私有的成员函数着,就通过 getXX 和 setXX 方法来访问。一个赋值函数(getXX),一个取值函数(setXX )。

从上面的例子中看到,init()方法中默认参数是 size=(40, 40) 在函数体中定义 self._size = size。通过变量传递,self._size=(40, 40) ,但 self._size 是私有的,不可被类以外的方法和函数调用。(self 表示类本身,后面章节中会进一步解释。)

所以,在 getSize()方法中定义返回 self.size,那么就可以调用 getSize()方法来使用__init_()方法中self._size。

测试类:

#coding= utf-8
from widget import Widget
import unittest
# 执行测试的类
class WidgetTestCase(unittest.TestCase):
def setUp(self):
self.widget = Widget()
def testSize(self):
self.assertEqual(self.widget.getSize(), (40, 40))
def tearDown(self):
self.widget = None
# 构造测试集
def suite():
suite = unittest.TestSuite()
suite.addTest(WidgetTestCase("testSize"))
return suite
# 测试
if __name__ == "__main__":
unittest.main(defaultTest = 'suite')

用 import 语句引入 unittest 模块

让所有执行测试的类都继承于 TestCase 类,可以将 TestCase 看成是对特定类进行测试的方法的集合。

setUp()方法中进行测试前的初始化工作,tearDown()方法中执行测试后的清除工作。setUp()
和 tearDown()都是 TestCase 类中定义的方法。

在 testSize()中调用 assertEqual()方法,对 Widget 类中 getSize()方法的返回值和预期值进行比较,确保两者是相等的,assertEqual()也是 TestCase 类中定义的方法。

提供名为 suite()的全局方法,PyUnit 在执行测试的过程调用 suit()方法来确定有多少个测试用例需要被执行,可以将 TestSuite 看成是包含所有测试用例的一个容器。

编写测试用例
执行测试的类

class WidgetTestCase(unittest.TestCase):
def setUp(self):
self.widget = Widget()
#测试 getSize()方法的测试用例
def testSize(self):
self.assertEqual(self.widget.getSize(), (40, 40))
# 测试 resize()方法的测试用例
def testResize(self):
self.widget.resize(100, 100)
self.assertEqual(self.widget.getSize(), (100, 100))
def tearDown(self):
self.widget.dispose()
self.widget = None

组织用例集
完整的单元测试很少只执行一个测试用例,开发人员通常都需要编写多个测试用例才能对某一软件功能进行比较完整的测试,这些相关的测试用例称为一个测试用例集,在 PyUnit 中是用 TestSuite 类来表示的。
可以在单元测试代码中定义一个名为 suite()的全局函数,并将其作为整个单元测试的入口,PyUnit 通过调用它来完成整个测试过程。

def suite():
suite = unittest.TestSuite()
suite.addTest(WidgetTestCase("testSize"))
suite.addTest(WidgetTestCase("testResize"))
return suite

如果用于测试的类中所有的测试方法都以 test 开头,Python 程序员甚至可以用 PyUnit 模块提供的makeSuite()方法来构造一个。

def suite():
return unittest.makeSuite(WidgetTestCase, "test")

TestSuite 类可以看成是 TestCase 类的一个容器,用来对多个测试用例进行组织,这样多个测试用例可以自动在一次测试中全部完成。

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值