聊一聊单元测试

Python中自带的单元测试框架是unittest模块,它里面包括了一些校验返回结果的方法和一些用例执行前的初始化操作;

TestCase就是测试用例

TestSuite多个测试用例集合在一起

TestLoader用来加载TestCase到TestSuite中的

TestRunner就是用来执行测试用例的,测试的结果会保存在TestResult实例中,包括运行了多少测试用例,成功了多少,失败了多少等信息

简单的单元测试用例:

import unittest
def calc(x,y):
    return x+y
class TestCalc(unittest.TestCase):
    def test_pass_case(self):
        '''这个是通过测试用例'''
        print('这个是通过测试用例!')
        res=calc(1,2)
        self.assertEqual(3,res)
        self.assertNotEqual(4,res)#返回的结果不一样
    def test_a(self):
        '''这个是普通的测试用例'''
        print('a')
    def test_fail_case(self):
        '''这个是失败的测试用例'''
        print('这个是失败的测试用例')
        res=calc(3,4)
        self.assertEqual(8,res)
if __name__=='__main__':
    unittest.main()#运行所有的测试用例
import unittest
def calc(x,y):
    return x+y
class TestCalc(unittest.TestCase):
    def test_pass_case(self):
        '''这个是通过测试用例'''
        print('这个是通过测试用例!')
        res=calc(1,2)
        self.assertEqual(3,res)
        self.assertNotEqual(4,res)#返回的结果不一样
    def setUp(self):
        #每个用例运行之前都会执行它
        print('我是setup')
    def tearDown(self):
        #每个用例运行完之后都会执行它
        print('我是tearDown')
    @classmethod
    def setUpClass(cls):
        #所有的用例执行之前执行一次
        print('我是setupClass')
    @classmethod
    def tearDownClass(cls):
        #所有用例都运行完之后执行一次
        print('我是tearDownClass')
    def test_a(self):
        '''这个是普通的测试用例'''
        print('a')
    def test_fail_case(self):
        '''这个是失败的测试用例'''
        print('这个是失败的测试用例')
        res=calc(3,4)
        self.assertEqual(8,res)
    def test_haha(self):
        '''哈哈哈'''
        self.assertEqual(1,2)
if __name__=='__main__':
    unittest.main()

生成测试报告,需要加入另一个模块:HTMLTestRunner。这个模块需要自己安装,执行测试用例后会生成一个html测试报告,会有每个测试用例的执行结果:

把HTMLTestRunner.py文件拷贝到pycharm中External Libraries—>site-packages里面

import unittest,HTMLTestRunner
def calc(x,y):
    return x+y
class TestCalc(unittest.TestCase):
    def test_pass_case(self):
        '''这个是通过测试用例'''
        print('这个是通过测试用例!')
        res=calc(1,2)
        self.assertEqual(3,res)
        self.assertNotEqual(4,res)#返回的结果不一样
    def setUp(self):
        #每个用例运行之前都会执行它
        print('我是setup')
    def tearDown(self):
        #每个用例运行完之后都会执行它
        print('我是tearDown')
    @classmethod
    def setUpClass(cls):
        #所有的用例执行之前执行一次
        print('我是setupClass')
    @classmethod
    def tearDownClass(cls):
        #所有用例都运行完之后执行一次
        print('我是tearDownClass')
    def test_a(self):
        '''这个是普通的测试用例'''
        print('a')
    def test_fail_case(self):
        '''这个是失败的测试用例'''
        print('这个是失败的测试用例')
        res=calc(3,4)
        self.assertEqual(8,res)
    def test_haha(self):
        '''哈哈哈'''
        self.assertEqual(1,2)
if __name__=='__main__':
    suite=unittest.TestSuite()#定义一个测试套件
    suite.addTest(TestCalc('test_pass_case'))#测试套件中添加测试用例
    suite.addTest(TestCalc('test_a'))
    suite.addTest(TestCalc('test_fail_case'))
    f=open('report.html','wb')#打开一个测试报告的文件
    runner=HTMLTestRunner.HTMLTestRunner(stream=f,title='wei测试结果',description='描述')#生成执行用例的对象
    runner.run(suite)#执行测试套件
import unittest,HTMLTestRunner
def calc(x,y):
    return x+y
class TestCalc(unittest.TestCase):
    def test_pass_case(self):
        '''这个是通过测试用例'''
        print('这个是通过测试用例!')
        res=calc(1,2)
        self.assertEqual(3,res)
        self.assertNotEqual(4,res)#返回的结果不一样
    def setUp(self):
        #每个用例运行之前都会执行它
        print('我是setup')
    def tearDown(self):
        #每个用例运行完之后都会执行它
        print('我是tearDown')
    @classmethod
    def setUpClass(cls):
        #所有的用例执行之前执行一次
        print('我是setupClass')
    @classmethod
    def tearDownClass(cls):
        #所有用例都运行完之后执行一次
        print('我是tearDownClass')
    def test_a(self):
        '''这个是普通的测试用例'''
        print('a')
    def test_fail_case(self):
        '''这个是失败的测试用例'''
        print('这个是失败的测试用例')
        res=calc(3,4)
        self.assertEqual(8,res)
    def test_haha(self):
        '''哈哈哈'''
        self.assertEqual(1,2)
if __name__=='__main__':
    suite=unittest.TestSuite()#定义一个测试套件
    suite.addTest(unittest.makeSuite(TestCalc))#这个类里面的所有测试用例
    f=open('report.html','wb')#打开一个测试报告的文件
    runner=HTMLTestRunner.HTMLTestRunner(stream=f,title='wei测试结果',description='描述')#生成执行用例的对象
    runner.run(suite)#执行测试套件

BeautifulReport:和HTMLTestRunner的作用一样,只是产生的报告更加美观与详尽。把BeautifulReport文件解压后拷贝到pycharm中的External Libraries—>site-packages里面

import unittest
from BeautifulReport import BeautifulReport
def calc(x,y):
    return x+y
class TestCalc(unittest.TestCase):
    def test_pass_case(self):
        '''这个是通过测试用例'''
        print('这个是通过测试用例!')
        res=calc(1,2)
        self.assertEqual(3,res)
        self.assertNotEqual(4,res)#返回的结果不一样
    def setUp(self):
        #每个用例运行之前都会执行它
        print('我是setup')
    def tearDown(self):
        #每个用例运行完之后都会执行它
        print('我是tearDown')
    @classmethod
    def setUpClass(cls):
        #所有的用例执行之前执行一次
        print('我是setupClass')
    @classmethod
    def tearDownClass(cls):
        #所有用例都运行完之后执行一次
        print('我是tearDownClass')
    def test_a(self):
        '''这个是普通的测试用例'''
        print('a')
    def test_fail_case(self):
        '''这个是失败的测试用例'''
        print('这个是失败的测试用例')
        res=calc(3,4)
        self.assertEqual(8,res)
    def test_haha(self):
        '''哈哈哈'''
        self.assertEqual(1,2)
if __name__=='__main__':
    suite=unittest.TestSuite()#定义一个测试套件
    suite.addTest(unittest.makeSuite(TestCalc))#这个类里面的所有测试用例
    result=BeautifulReport(suite)
    result.report(filename='xiaoReport',description='描述',log_path='.')

运行不是同一个.py文件里面的case:

cases:同一个目录下的文件夹,包含三个python文件 test_buy,test_login,test_reg
import unittest

class TestBuy(unittest.TestCase):
    def test_a(self):
        self.assertEqual(1,1)

    def test_b(self):
        self.assertEqual(1,2)

class TestBuy2(unittest.TestCase):
    def test_buy_phone(self):
        self.assertEqual(1,1)



import unittest

class TestLogin(unittest.TestCase):
    def test_a(self):
        self.assertEqual(1,1)

    def test_b(self):
        self.assertEqual(1,2)


import unittest
class TestReg(unittest.TestCase):
    def test_a(self):
        self.assertEqual(1,1)

    def test_b(self):
        self.assertEqual(1,2)

class TestReg2(unittest.TestCase):
    def test_buy_phone(self):
        self.assertEqual(1,1)

run_all_cases.py文件测试执行上述测试用例:

import unittest
from BeautifulReport import BeautifulReport
suite=unittest.TestSuite()
all_case=unittest.defaultTestLoader.discover('cases','test_*.py')
[suite.addTest(case) for case in all_case]
result=BeautifulReport(suite)
result.report(filename='Bea测试报告',description='描述',log_path='.')

后续进行持续集成时会用到Jenkins,让代码自动运行,但是Jenkins不认识html格式的测试报告。所以要生成Jenkins认识的格式的测试报告了,xml格式。所有需要用到xmlrunner模块,直接pip install xmlrunner 按照即可:

1 import unittest
2 import xmlrunner#为了以后给Jenkins看
3 suite=unittest.TestSuite()
4 all_case=unittest.defaultTestLoader.discover('cases','test_*.py')
5 # for case in all_case:
6 #     suite.addTest(case)
7 [suite.addTest(case) for case in all_case]#列表生成式,和上面代码是一样的
8 runner=xmlrunner.XMLTestRunner('.')#这是是为了产生报告给Jenkins看
#runner=xmlrunner.XMLTestRunner(output='report1')#指定生成目录
9 runner.run(suite)#运行用例

在这里插入图片描述
如果对软件测试有兴趣,想了解更多的测试知识,解决测试问题,以及入门指导,帮你解决测试中遇到的困惑,我们这里有技术高手。如果你正在找工作或者刚刚学校出来,又或者已经工作但是经常觉得难点很多,觉得自己测试方面学的不够精想要继续学习的,想转行怕学不会的, 都可以加入我们在这里插入图片描述
,群内可领取最新软件测试大厂面试资料和Python自动化、接口、框架搭建学习资料!

猜你喜欢

转载自blog.csdn.net/qq_42434318/article/details/113618341