UnitTest

UnitTest框架
是Python自带的单元测试框架,也可以用来做自动化测试(管理和执行用例)
核心要素(组成):
1、TestCase(测试用例)
2、TestSuite(测试套件):打包TestCase
3、TestRunner(测试执行):执行Testsuite
4、TestLoader(测试加载):对TestSuite的补充,也是打包TestCase的
5、Fixture(测试夹具):一种代码结构,书写前置方法(执行用例之前的方法)和后置方法(执行用例之后的方法)

 

单个用例创建及执行

import unittest

# 定义测试类(只要继承unittest.TestCase类,就是测试类)
class TestDemo(unittest.TestCase):
    # 书写测试方法,方法中的代码就是真正用例代码,方法名必须以test开头
    def test01(self):
        print('测试方法一')

    def test02(self):
        print('测试方法二')

# 执行
if __name__ == '__main__':
    unittest.main()

 

多个用例及执行

test_01.py

import unittest

# 定义测试类(只要继承unittest.TestCase类,就是测试类)
class TestDemo01(unittest.TestCase):
    # 书写测试方法,方法中的代码就是真正用例代码,方法名必须以test开头
    def test01(self):
        print('1-1')

    def test02(self):
        print('1-2')

test_02.py

import unittest

# 定义测试类(只要继承unittest.TestCase类,就是测试类)
class TestDemo02(unittest.TestCase):
    # 书写测试方法,方法中的代码就是真正用例代码,方法名必须以test开头
    def test01(self):
        print('2-1')

    def test02(self):
        print('2-2')

testSuite_Runner.py

import unittest
from test_01 import TestDemo01
from test_02 import TestDemo02

suite = unittest.TestSuite()  # 实例化套件对象
# 方法一:往测试套件里添加测试类中的某一个测试方法
#suite.addTest(TestDemo01('test01'))  # 套件对象.addTest(测试类名('测试方法名'))
#suite.addTest(TestDemo01('test02'))  # 套件对象.addTest(测试类名('测试方法名'))
#suite.addTest(TestDemo02('test01'))  # 套件对象.addTest(测试类名('测试方法名'))
#suite.addTest(TestDemo02('test02'))  # 套件对象.addTest(测试类名('测试方法名'))

# 方法二:往测试套件里添加测试类下所有的测试方法
#suite.addTest(unittest.makeSuite(TestDemo01))
#suite.addTest(unittest.makeSuite(TestDemo02))

# 方法三:用TestLoader发现所有案例,得到的是套件对象
suite = unittest.TestLoader().discover('.', 'test_*.py')

runner = unittest.TextTestRunner()  # 实例化执行对象
runner.run(suite)  # 执行对象.run(套件对象)

 

 

fixture的使用

testCases.py

import unittest

class TestLogin(unittest.TestCase):
    # 前置类方法
    @classmethod    # 类方法,需要添加装饰器
    def setUpClass(cls):
        print('1.open brower')
        
    # 后置类方法
    @classmethod
    def tearDownClass(cls):
        print('9.close brower')
        
    # 前置方法
    def setUp(self):
        print('2.input url')
        print('3.click login')

    # 后置方法
    def tearDown(self):
        print('7.click logout')
        print('8.close url')
        
    def testLogin1(self):
        print('4.input user 1')
        print('5.input password 1')
        print('6.click login button')
        
    def testLogin2(self):
        print('4.input user 2')
        print('5.input password 2')
        print('6.click login button')
        
        
if __name__ == '__main__':
    unittest.main()

 

 testRunner.py

import unittest

suite = unittest.TestLoader().discover('.', 'testCases.py')
unittest.TextTestRunner().run(suite)

# 执行结果如下

1.open brower  # 前置类方法
2.input url  # 前置方法
3.click login
4.input user 1
5.input password 1
6.click login button
7.click logout  # 后置方法
8.close url
.2.input url  # 前置方法
3.click login
4.input user 2
5.input password 2
6.click login button
7.click logout  # 后置方法
8.close url
.9.close brower # 后置类方法

 

断言

tools.py

def add(a, b):
    return a + b

assert_case.py

import unittest
from tools import add

class AssertCase(unittest.TestCase):
    def test01(self):
        ## 测试类.assertEqual(预期结果,实际结果)
        self.assertEqual(2, add(1, 1))
        
    def test_assert_not_equal2(self):
        self.assertEqual(3, add(1, 2))


    def test_assert_in3(self):
        ## 测试类.assertIn(预期结果,实际结果集) 预期结果在实际结果集里面
        self.assertIn(add(2, 3), [5, 6, 7])
        
        

if __name__ == '__main__':
    unittest.main()

assert_runner.py

import unittest
from assert_case import AssertCase

suite = unittest.TestSuite()
suite.addTest(unittest.makeSuite(AssertCase))

unittest.TextTestRunner().run(suite)

 

断言+参数化(paramterized需要提前用pip安装)

 

 assert_case.py

import unittest
import json
from tools import add
from parameterized import parameterized

# data = [(2, 1, 1), (3, 1, 2), (4, 2, 2), (5, 3, 2)]   # 方法一 将数据源直接写在Python文件中

# 方法二 将数据源写在json文件中
with open('data.json', encoding='utf-8') as f:
    data = json.load(f)  # [[2, 1, 1], [3, 1, 2], [4, 2, 2], [5, 3, 2]]



class AssertCase(unittest.TestCase):
    @parameterized.expand(data)     # 直接取数据源列表[(),()]
    def test01(self, excpect, a, b):
        ### 测试类.assertEqual(预期结果,实际结果)
        self.assertEqual(excpect, add(a, b))



if __name__ == '__main__':
    unittest.main()

assert_runner.py

#import unittest
#from assert_case import AssertCase

#suite = unittest.TestSuite()
#suite.addTest(unittest.makeSuite(AssertCase))

# unittest.TextTestRunner().run(suite)



# 生成测试报告(替换下runner对象)
import unittest
from htmltestreport import HTMLTestReport
from assert_case import AssertCase

suite = unittest.TestSuite()
suite.addTest(unittest.makeSuite(AssertCase))

HTMLTestReport('HTMLTestReport.html', 'TestRepoer', 'This is a test report.').run(suite)

 

 

跳过

import unittest
v = 2

class SkipCase(unittest.TestCase):
    @unittest.skip('暂时不想执行')
    def testCase01(self):
        print('test01')

    @unittest.skipIf(v >= 2, '版本大于等于2就不执行')
    def testCase02(self):
        print('test02')
        
    def testCase03(self):
        print('test03')
        

if __name__ == '__main__':
    unittest.main()

 

posted @ 2024-07-31 10:53  Sakura媛媛  阅读(5)  评论(0编辑  收藏  举报