其实不用测试框架也是可以完成脚本的。举个例子:开发写了一段代码如下
#calculator.py
#整数的加法运算
class Count:
#给类的实例变量赋初始值
def __init__(self,a,b):
self.a=int(a)
self.b=int(b)
#计算实例变量的和并返回
def add(self):
return self.a+self.b
要测试上面这段代码,不用框架的话是这么写的:
#testcount.py
from calculator import Count
class TestCount:
def test_add(self):
try:
c=Count(2,3)
s=c.add()
assert s==5,'test fail' #断言格式:assert 表达式,'报错信息',表达式如果不成立,则抛出异常错误,给出后面的报错信息,如果成立,则测试通过
except AssertionError as msg:
print(msg)
else:
print('test pass')
mytest=TestCount()
mytest.test_add()
可以看出来,不用测试框架的时候辅助代码会写的比较多,最主要的一个缺点是不同的人写出来的代码不一样,为了让我们的单元测试代码更容易维护和编写,所以才引入了单元测试框架。
据我所知,python的单元测试框架有unittest、pytest等,这篇笔记以unittest为例。
#testcount1.py
import unittest
from calculator import Count
class TestCount(unittest.TestCase): #使用unittest写单元测试时,创建的单元测试用例的类必须继承unittest的TestCase类
def setUp(self): #setUp()方法用于测试用例执行前的初始化工作
print('test start')
def tearDown(self): #tearDown()方法用于测试用例执行后的清理工作
print('test end')
def test_add(self): #使用unittest提供的assertEqual()方法对add的返回值进行断言
c=Count(2,3)
self.assertEqual(c.add(),5)
if __name__=='__main__':
unittest.main() #unittest提供了main()方法,main()方法可以自己去搜索所有包含再当前模块的所有以test开头的测试方法,并自动执行它们。
注意:1.使用unittest组织的单元测试里,可以自动执行的方法有:setUp(),tearDown(),以test打头的方法,除此之外的其他方法不会自动执行。
2.运行有两种方式:一种是上面这种直接通过unittest.main()来加载所有的测试用例进行执行,还有一种是将所有的测试用例添加到测试套件中,然后执行。
Python语言编写的WebDriver测试脚本通常使用单元测试框架来运行,由此可以看出单元测试框架的主要是提供了:
(1)测试用例的组织与执行
(2)丰富的断言方法
(3)丰富的日志信息
(1)Test Case(测试用例)
测试用例指的是一个完整的测试流程,包括测试前的准备工作、测试过程即测试后的环境清理
(2)Test Suite(测试套件)
一个功能的验证往往需要多条测试用例,将许多的测试用例组织在一起执行,就产生了测试套件的概念。Test Suite可以用来组装单个的测试用例
(3)Test Runner(测试运行器)
一个Test Runner由执行设定的测试用例和将测试结果提供给用户两部分功能组成
(4)Test Fixture(测试固件)
一个Test Fixture代表一个或多个测试执行前的准备工作和测试结束后的清理工作
下面的栗子是将测试用例添加到测试套件中进行加载的示例:
import unittest
from calculator import Count
class TestCount(unittest.TestCase):
def setUp(self):
print('test start')
def tearDown(self):
print('test end')
def test_add1(self):
c=Count(2,3)
self.assertEqual(c.add(),5)
def test_add2