python测试框架untest怎么循环执行_Python 自动化测试框架unittest

最近工作中向同事学习了利用Python的unittest做自动化测试,另外简单查些资料做些补充。

测试的通用规则

测试单元应该集中于小部分的功能,并且证明它是对的。

每个测试单元应该完全独立,它们都能够单独运行,也可以在测试套件中运行,而不用考虑被调用的顺序。

unittest

unittest 是Python内置的单元测试测试框架,具备:

编写用例,即 test fixture

组织用例,即 test case,test suite

执行用例,即 test Loader

输出报告,即 test runner

等自动化测试框架必备条件。

test fixture

一个测试用例的初始化准备及环境还原,主要是 setUp() 和 setDown() 方法。

test case

一个完整的测试单元,执行该测试单元可以完成对某一个问题的验证。完整体现在:

测试前环境准备

执行测试代码

测试后环境还原

test suite

多个测试用例的集合,测试套件或测试计划。

test Loader

加载 TestCase 到 TestSuite 中的。

test runner

执行测试用例,并将测试结果保存到TextTestResult实例中,包括运行了多少测试用例, 成功了多少,失败了多少等信息。

unittest的工作原理

// todo

unittest实战

待测模块

def is_prime(number):

if number < 0 or number in (0, 1):

return False;

for element in range(2, number):

if number % element == 0:

return False;

return True

def add(a, b):

return a + b;

def divide(a, b):

return a / b;

使用unittest编写测试用例

import unittest

class TestMyFunc(unittest.TestCase):

def setup(self):

print("每个用例执行前后会调用setUp方法准备环境")

def tearDown(self):

printf("每个用例执行前后会调用tearDown方法进行环境清理");

def test_is_prime(self):

'''test method is_prime'''

self.assertEqual(is_prime(5))

self.assertEqual(is_prime(0))

self.assertEqual(is_prime(-1))

def test_add(self)

'''test method divide'''

self.assertEqual(3, add(1, 2))

self.assertEqual(3, add(2, 2))

def test_divide(self):

'''test method divide'''

self.assertEqual(3, divide(6, 3))

self.assertEqual(3, divide(5, 2))

if __name == '__main__':

unittest.main()

框架解决自动化需求的4个问题

如何控制用例执行顺序

在unittest中,用例是以test开头的方法定义的,默认执行顺序是根据用例名称升序进行,为不是用例定义的先后顺序。在unittest中解决顺序的问题是使用TestSuite。代码如下:

if __name__ == '__main__':

tests = [TestMyFunc("test_is_prime"), TestMyFunc("test_add"), TestMyFunc("test_divide")]

suite = unittest.TestSuite()

suite.addTest(tests);

runner = unittest.TextTestRunner()

runner.run(suite)

如何让多个用例共用setup,teardown

unitest 的 setup,teardown 会在用例执行前后执行一次,如上面测试用例类中有3个测试用例,那么每个用例执行前后执行 setup,执行后会执行teardown,即 setup,teardown 总过调用三次。但考虑实际自动化测试场景,多个用例只需执行一次setup,全部用例执行完成后,执行一次teardown,针对该种场景,unittest的处理方法是使用setupclass,teardownclass,注意如下:

class TestMyFunc(unittest.TestCase):

@classmethod

def setUpClass(cls):

print('所有用例执行前会调用一次setUp准备环境')

@classmethod

def tearDownClass(cls):

print('所有用例执行后会调用一次tearDown进行环境清理')

def test_is_prime(self):

''' test method divide'''

self.assertEqual(2, divide(6, 3))

slef.assertNotEqual(2, divide(5, 2))

if __name__ == '__main__':

unittest.main()

如何跳过用例

在自动化测试中,可能会用到选择性执行用例的情况,在unittest中解决的方法是使用skip装饰器,其中skip装饰器主要有3种:unittest.skip(reason),unittest.skipif(condition, reason),unittest.skipUnless(condition, reason),即在满足condition条件下跳过改用例,reason用于描述跳过的原因。

...

@unittest.skipUnless(sys.platform.startwith('linux'), 'requires Linux')

def test_devide(self):

self.assertEqual(2, divide(6, 3))

self.assertEqual(2, divide(5, 2))

if __name__=='__main__':

unittest.main()

如何生成自动化测试报告

unittest中模块生成的报告格式为txt,如果想生成html格式的报告,可以使用HtmlTestRunner模块,安装后导入该模块,使用HTMLTestRunner代替默认的TextTestRunner()执行测试用例即可。

from HtmlTestRunner import HTMLTestRunner

suite = unittest.TestSuite()

suite.addTest(unittest.TestLoader().loadTestFromTestCase(TestMyfunc))

sunner.run(suite)

你可能感兴趣的:(python测试框架untest怎么循环执行_Python 自动化测试框架unittest)