一、前言
框架的概念:
在系统开发过程中,框架是指对特定应用领域中的应用系统的部分设计和实现子系统的整体结构
框架将应用系统划分为类和对象,定义类和对象的责任,类和对象如何互相协作,以及对象之间的控制线程。这些共有的设计因素由框架预先定义,应用开发人员只须关注于特定的应用系统特有部分
自动化测试框架的定义为:
由一个或多个自动化测试基础模块、自动化测试管理模块、自动化测试统计模块等组成的工具集合
1.按框架的定义来分,自动化测试框架可以分为:基础功能测试框架、管理
执行框架
2.按不同的测试类型来分,可以分为:功能自动化测试框架、性能自动化测
试框架
3.按测试阶段来分,可以分为:单元自动化测试框架、接口自动化测试框架、
系统自动化测试框架
4.按组成结构来分,可以分为:单一自动化测试框架、综合自动化测试框架
5.按部署方式来分,可以分为:单机自动化测试框架、分布式自动化测试框架
二、Unittest框架
熟悉Unittest测试框架是后续使用Python进行自动化测试的基础,Unittest框架(又名PyUnit框架)为Python语言的单元测试框架。其官方介绍文档链接为:https://docs.python.org/2.7/library/unittest.html#module-unittest
Unittest测试框架使用介绍:
1.用import语句引入unittest模块
2.让所有执行测试的类都继承于TestCase类,可以将TestCase看成是对特定类进行测试的方法的集合
3.setUp()方法中进行测试前的初始化工作,teardown()方法中执行测试后的清除工作,它们都是TestCase中的方法
4.编写测试的方法最好以test开头(可以直接运行) def test_add(self) 、def test_sub(self)等,可以编写多个测试用例对被测对象进行测试
5.在编写测试方法过程中,使用TestCase class提供的方法测试功能点,比如:assertEqual等
6.调用unittest.main()方法运行所有以test开头的方法
三、代码实例
对模块中的加法功能测试
存在一个calc.py的模块,里面存在一个加法功能:
import unittest #导入unittest
import calc #导入被测模块
def sum(a,b):
return a+b;
class mytest(unittest.TestCase):
def setUp(self): #初始化工作
pass;
def tearDown(self): #退出清理工作
pass;
def testsum(self): #具体的测试用例,一定要以test开头
self.assertEqual(calc.sum(1,2),2,"testing sum");
if __name__=="__main__":
unittest.main();
四、常用断言
unittest中常用的assert语句:
语句 | 说明 |
---|---|
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) |
assertGreater(a, b) | a > b |
assertGreaterEqual(a, b) | a >= b |
assertLess(a, b) | a < b |
assertLessEqual(a, b) | a <= b |
五、创建测试代码方式
unittest创建测试代码的方式:
方式一:创建子类继承unittest.TestCase,然后重写runTest方法
class WidgetTestCase(unittest.TestCase):
def setUp(self):
pass;
def runTest(self):
pass;
def tearDown(self):
pass;
方式二:编写以test开头的方法
class WidgetTestCase(unittest.TestCase):
def setUp(self):
pass;
def test_xx1(self):
def test_xx2(self):
...
def test_xxN(self):
def tearDown(self):
pass;
六、构建测试套件(测试用例集合)
前提Tester是继承了unittest.TestCase的子类
方式一:
Suite = unittest.TestSuite();
Suite.addTest(Tester('test_default_size'));
Suite.addTest(Tester('test_resize'));
方式二(推荐):
def suite():
suite = unittest.TestSuite();
suite.addTest(Tester('test_default_size'));
suite.addTest(Tester('test_resize'));
return suite;
方式三(推荐):
def suite():
tests = ['test_default_size', 'test_resize']
return unittest.TestSuite(map(Tester, tests));
构建测试套件
例如:
存在如下类calc:
class calc(): #计算器类
def __init__(self,a,b): #初始化
self.numa = a;
self.numb = b;
def sum(self): #加法
return self.numa+self.numb;
def sub(self): #减法
return self.numa-self.numb;
def multi(self): #乘法
pass;
测试方法如:
import unittest #导入unittest
import calc
class mytest(unittest.TestCase):
def setUp(self): #初始化工作
self.testnum = calc.calc(3,4);
def tearDown(self): #退出清理工作
del self.testnum;
def testsum(self): #具体的测试用例
self.assertEqual(self.testnum.sum(),7,"testing sum");
def testsub(self): #具体的测试用例
self.assertEqual(self.testnum.sub(),-1,"testing sub");
def testmulti(self): #具体的测试用例
self.assertEqual(self.testnum.multi(),12,"testing multi");
def suite():
suite = unittest.TestSuite();
suite.addTest(mytest("testsum"));
suite.addTest(mytest("testsub"));
return suite;
if __name__=="__main__":
unittest.main(defaultTest = 'suite');