首页 >> 大全

类方法修饰器在自动化测试中的解耦作用

2023-08-31 大全 30 作者:考证青年

上一期讲解了类方法和静态方法在类中的调用方法和作用,这一期讲解类方法修饰器在自动化测试中的解耦作用。首先看以下一个测试Demo,代码如下,和输出结果如 图1, 可见测试用例输出中,并不是按代码顺序输出,而是按字母顺序输出,这个有比较明显的缺点:用例名称会不够美观、杂乱无章。

import unittestclass TestCase(unittest.TestCase):def setUp(self):print('set up')def tearDown(self):print('tear down')def test_case_B(self):print('test_case_B')def test_case_A(self):print('test_case_A')def test_case_C(self):print('test_case_C')if __name__ == '__main__':unittest.main()   

图1

另外我们可以用 控制用例加载顺序,缺点是,当case较多 时,逐个添加非常麻烦。具体代码如下,输出结果如 图2, 可见输出结果也是一样的,说明这两种方法都可行的。但如果当下一个测试用例的执行需要依赖上一个用例的执行结果时,这应该怎么办呢?

import unittestclass TestCase(unittest.TestCase):def setUp(self):print('set up')def tearDown(self):print('tear down')def test_case_B(self):print('test_case_B')def test_case_A(self):print('test_case_A')def test_case_C(self):print('test_case_C')if __name__ == '__main__':suite = unittest.TestSuite()   # 添加 suite 容器suite.addTest(TestCase('test_case_A'))suite.addTest(TestCase('test_case_B'))suite.addTest(TestCase('test_case_C'))runner = unittest.TextTestRunner()runner.run(suite)

图2

再举另外一个测试用例的例子,代码如下,从 图3 的输出结果看,可见每个测试用例结束后都会调用 ,那该如何避免呢?

import unittestclass TestCase(unittest.TestCase):							def setUp(self):self.a = 2self.b = 3print('set up')print('a = %s, b = %s \n'%(self.a, self.b))def tearDown(self):a = 0b = 0print('tear down')print('a = %s, b = %s'%(a, b))print('__________________________________________________________')def test_case_B(self):a = self.a*3b = self.b*3print('test_case_B')print('a= %s, b = %s \n'%(a, b))def test_case_A(self):a = self.a*3b = self.b*3print('test_case_A')print('a = %s, b = %s \n'%(a, b))if __name__ == '__main__':suite = unittest.TestSuite()suite.addTest(TestCase('test_case_A'))suite.addTest(TestCase('test_case_B'))runner = unittest.TextTestRunner()runner.run(suite)

图3

方法一: 在需要依赖的用例中,把上一个用例单独作为一个公用的方法,然后在进入这个用例时先调用该方法。例如用例B需要用例A返回的结果,那么可以把用例A封装成一个通用的方法,根据传入的不同返回不同的值。然后在用例B中获取返回的值,作为用例B开始前的另一种的 ‘setUp’, 把代码稍微修改一下,输出结果如 图4

牛中牛网页自动点击器__自动捕鸟器自制方法

import unittestdef set_A(a, b):a = a*2b = b*2return a, bclass TestCase(unittest.TestCase):def setUp(self):self.a = 2self.b = 3print('set up over :')print('a = %s, b = %s \n'%(self.a, self.b))		def tearDown(self):a = 0b = 0print('tear down over :')print('a = %s, b = %s'%(a, b))print('__________________________________________________________')								def test_case_B(self):a, b = set_A(self.a, self.b)a = a*2b = b*2print('run B over :')print('a= %s, b = %s \n'%(a, b))def test_case_A(self):a = self.a*2b = self.b*2print('run A over :')print('a = %s, b = %s \n'%(a, b))def test_case_C(self):a = self.a*4b = self.b*4print('run C over :')print('a = %s, a = %s \n'%(a, b))if __name__ == '__main__':suite = unittest.TestSuite()suite.addTest(TestCase("test_case_A"))suite.addTest(TestCase("test_case_B"))suite.addTest(TestCase("test_case_C"))runner = unittest.TextTestRunner()runner.run(suite)

图4

在测试用例难以解耦的情况下,每写下一个用例就要封装上一个用例的方法,这会导致代码长度翻倍增长。因此控制setUp和方法只执行一次是必须的,把代码再稍微修改一下,这时修饰器@登场了,输出结果如 图5,可见setUp 和 只输出一次。在实际的自动化模块测试中,主要是具体问题具体分析整个流程思路,不一定必须要控制setUp 和 只输出一次的,具体要在实际测试经验中而决定。

import unittestdef set_A(a, b):a = a*2b = b*2return a, bclass TestCase(unittest.TestCase):@classmethoddef setUpClass(self):self.a = 2self.b = 3print('set up over :')print('a = %s, b = %s \n'%(self.a, self.b))@classmethoddef tearDownClass(self):a = 0b = 0print('tear down over :')print('a = %s, b = %s'%(a, b))print('__________________________________________________________')								def test_case_B(self):a, b = set_A(self.a, self.b)a = a*2b = b*2print('run B over :')print('a= %s, b = %s \n'%(a, b))def test_case_A(self):a = self.a*2b = self.b*2print('run A over :')print('a = %s, a = %s \n'%(a, b))def test_case_C(self):a = self.a*4b = self.b*4print('run C over :')print('a = %s, a = %s \n'%(a, b))if __name__ == '__main__':								suite = unittest.TestSuite()suite.addTest(TestCase("test_case_A"))suite.addTest(TestCase("test_case_B"))suite.addTest(TestCase("test_case_C"))runner = unittest.TextTestRunner()runner.run(suite)

图5

关于我们

最火推荐

小编推荐

联系我们


版权声明:本站内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 88@qq.com 举报,一经查实,本站将立刻删除。备案号:桂ICP备2021009421号
Powered By Z-BlogPHP.
复制成功
微信号:
我知道了