测试用例框架
在日常工作中,我们开发功能完成后,往往需要进行测试,保证功能可以正常运行,传统的人工测试有投入高、耗时长等问题,自动化测试框架也应运而生。由于JDA的代码开发采用Python3,其中的unittest测试框架基本可以满足测试需求,在它的基础上封装了RpaTest框架,降低了使用难度。
1. unittest
因为是基于unittest,所以使用前还是需要对这个框架有些简单的了解,首先介绍下原生unittest中几个重要的概念。
TestCase:一个TestCase就是一个测试用例,在这个用例内部可以有若干测试函数,并且可以重写特定的函数以实现测试环境的搭建、清理。
TestSuite:多个TestCase的集合,TestSuite也可以嵌套。
TestLoader:加载TestCase,生成TestSuite。
TestRunner:执行TestSuite或者TestCase中的run方法,产生测试结果。
关于unittest更详细的说明可以在网上查找资料,JDA封装后已经简化了很多步骤,平常使用无需再考虑其他细节,只专注于用例编写即可。
2. RpaTest
简单来说,用RpaTest开发测试用例编写代码需要三个步骤。
1、定义用例类,继承自RpaTestCase。
2、定义测试方法,用test开头。
3、执行测试用例。
除了代码之外还需要在设计界面的表格面板添加3列,用于显示结果。
我们用一个例子来说明如何操作。
第一步,编辑测试代码。
from Test.RpaTest import RpaTestCase
from Test.RpaTest import RunTestCase
class MyTestCase(RpaTestCase):
def test_one(self):
"""第一个测试函数"""
pass
def test_two(self):
"""第二个测试函数"""
a = 1
self.assertEqual(a, 2)
RunTestCase(MyTestCase)
这是一段非常基础的单元测试代码,直接复制到JDA的代码编辑器里就可以了。下图详细解释了每一句代码的作用。
第二步,设计结果输出表格。只需要按下图添加3列即可。
运行结果:
3. RpaTest进阶
大家做测试应该经常会遇到这样的情况,先准备测试环境(比如打开某个网页),进行测试任务,再清理测试环境,如果每一个测试方法都重复编写这些代码效率是非常低的,而且也不利于维护。unittest提供了对应的接口可以实现测试环境相关的处理。
在上一例子代码的基础上稍做修改:
from Test.RpaTest import RpaTestCase
from Test.RpaTest import RunTestCase
class MyTestCase(RpaTestCase):
def setUp(self):
rpa_log('测试前')
def tearDown(self):
rpa_log('测试后')
def test_one(self):
"""第一个测试函数"""
rpa_log('执行测试一')
def test_two(self):
"""第二个测试函数"""
rpa_log('执行测试二')
RunTestCase(MyTestCase)
我们添加了setUp和tearDown两个方法,setUp会在每一个测试方法前运行,tearDown会在每一个测试方法后运行,可以在这两个方法中进行测试环境的搭建和清理。
运行结果:
从运行日志可以看出,setUp和tearDown在每一个测试方法运行前后都会执行,但有些情况下不需要每次都布置测试环境,只要在测试用例期间布置一次,这种情况也是可以做到的。
再次修改代码为:
from Test.RpaTest import RpaTestCase
from Test.RpaTest import RunTestCase
class MyTestCase(RpaTestCase):
@classmethod
def setUpClass(cls):
rpa_log('测试前')
@classmethod
def tearDownClass(cls):
rpa_log('测试后')
def test_one(self):
"""第一个测试函数"""
rpa_log('执行测试一')
def test_two(self):
"""第二个测试函数"""
rpa_log('执行测试二')
RunTestCase(MyTestCase)
setUpClass和tearDownClass在MyTestCase用例执行期间只运行一次,值得注意的是,这两个方法必须用装饰器声明为类方法,写法就是在方法上一行加上@classmethod,原理就不展开介绍了,以后写的用例逐渐复杂时,可以再深入学习Python3来探究。
运行结果:
4. 附录
最后附上用例中常用的校验结果的方法列表以供参考。
断言 | 描述 |
---|---|
assertFalse(self, expr, msg=None) | 验证expr为False,验证不通过时附加msg消息 |
assertTrue(self, expr, msg=None) | 验证expr为True,验证不通过时附加msg消息 |
assertEqual(self, first, second, msg=None) | 验证first == second,验证不通过时附加msg消息 |
assertNotEqual(self, first, second, msg=None) | 验证first != second,验证不通过时附加msg消息 |
assertIn(self, member, container, msg=None) | 验证member in container,验证不通过时附加msg消息 |
assertNotIn(self, member, container, msg=None) | 验证member not in container,验证不通过时附加msg消息 |
assertIs(self, expr1, expr2, msg=None) | 验证expr1 is expr2,验证不通过时附加msg消息 |
assertIsNot(self, expr1, expr2, msg=None) | 验证expr1 is not expr2,验证不通过时附加msg消息 |
assertLess(self, a, b, msg=None) | 验证a < b,验证不通过时附加msg消息 |
assertLessEqual(self, a, b, msg=None) | 验证a <= b,验证不通过时附加msg消息 |
assertGreater(self, a, b, msg=None) | 验证a > b,验证不通过时附加msg消息 |
assertGreaterEqual(self, a, b, msg=None) | 验证a >= b,验证不通过时附加msg消息 |
assertIsNone(self, obj, msg=None) | 验证obj is None,验证不通过时附加msg消息 |
assertIsNotNone(self, obj, msg=None) | 验证obj is not None,验证不通过时附加msg消息 |
assertIsInstance(self, obj, cls, msg=None) | 验证isinstance(obj, cls),验证不通过时附加msg消息 |
assertNotIsInstance(self, obj, cls, msg=None) | 验证not isinstance(obj, cls),验证不通过时附加msg消息 |