第二篇 第一節 unittest框架的基本應用

unittest是Python自帶的單元測試框架,在unittest庫中,它自己封裝  一些校驗返回的結果方法和一些用例執行前的初始化操作

接下來,我們需要了解下unittest的幾個概念:  

1.  TestCase 也就是測試用例

2.  TestSuite 多個測試用例集合在一起,就是TestSuite

3.  TestLoader是用來加載TestCase到TestSuite中的

4.   TestRunner是來執行測試用例的,測試的結果會保存到TestResult實例中,包括運行了多少測試用例,成功了多少,失敗了多少等信息

接下來,我們以一個簡單例子來說明,用戶註冊:

1. 用戶註冊函數的邏輯代碼在:register.py模塊中

"""
用戶註冊要求如下:
1. 不允許註冊相同用戶名的賬號,即:用戶名唯一
2. 用戶名長度在[6,15]之間,包含6和15
3. 密碼長度不能小於6,且不能超過20;
"""
userinfo = {'Lujier': '123456', 'Lujier02': '234567'}

def register(username, password):
    if len(username) < 6 or len(username) > 15:
        return {'code': 2, 'msg': '用戶名長度須在6-15內'}
    elif len(password) < 6 or len(password) > 20:
        return {'code': 3, 'msg': '密碼長度須在6-20內'}
    elif username in userinfo.keys():
        return {'code': 1, 'msg': '該用戶名已被使用'}
    else:
        userinfo[username] = password
        return {'code': 0, 'msg': '註冊成功'}

2.  那我們開始設計測試用例:

1. 用戶名長度小於6:
   測試數據:username = 'Luji'  password='1234567'
   預期結果: {'code': 2, 'msg': '用戶名長度須在6-15內'}
2. 用戶名長度大於15:
   測試數據:username = '1234567890123456'  password='1234567'
   預期結果: {'code': 2, 'msg': '用戶名長度須在6-15內'}
3. 用戶名已被註冊:
   測試數據:username = 'Lujier'  password='1234567'
   預期結果: {'code': 1, 'msg': '該用戶名已被使用'}
4. 密碼長度小於6:
   測試數據: username = 'Lujier001'  password='12345'
   預期結果: {'code': 3, 'msg': '密碼長度須在6-20內'}
5. 密碼長度大於20:
   測試數據: username = 'Lujier001'  password='123456789012345678901'
   預期結果: {'code': 3, 'msg': '密碼長度須在6-20內'} 
6. 成功註冊:
   測試數據: username = 'Lujier001'  password='1234567'
   預期結果: {'code': 3, 'msg': '密碼長度須在6-20內'}

3. 接下來,我們開始定義一個測試類:TestRegister  

import unittest
from register import *


class TestRegister(unittest.TestCase):

    def setUp(self):
        # 每一條用例執行前都會進行該操作,一般用於做初始化處理
        pass

    def tearDown(self):
        # 跟setUp()對應,每一條用例執行完成後都會進行該操作
        pass

    def test_register_001(self):
        # 用戶名長度小於6
        data = ['Luji', '1234567']  # 測試數據
        expect_result = {'code': 2, 'msg': '用戶名長度須在6-15內'}  # 預期結果
        actual_result = register(*data)  # 測試結果
        try:
            self.assertEqual(actual_result, expect_result)
        except Exception as msg:
            print("test_register_001測試失敗,原因:{}!".format(msg))
            raise msg
        else:
            print("test_register_001用例執行成功")

    def test_register_002(self):
        # 用戶名長度大於15
        data = ['1234567890123456', '1234567']  # 測試數據
        expect_result = {'code': 2, 'msg': '用戶名長度須在6-15內'}  # 預期結果
        actual_result = register(*data)  # 測試結果
        try:
            self.assertEqual(actual_result, expect_result)
        except Exception as msg:
            print("test_register_002測試失敗,原因:{}!".format(msg))
            raise msg
        else:
            print("test_register_002用例執行成功")

    def test_register_003(self):
        # 用戶名已被註冊
        data = ['Lujier', '1234567']  # 測試數據
        expect_result = {'code': 1, 'msg': '該用戶名已被使用'}  # 預期結果
        actual_result = register(*data)  # 測試結果
        try:
            self.assertEqual(actual_result, expect_result)
        except Exception as msg:
            print("test_register_003測試失敗,原因:{}!".format(msg))
            raise msg
        else:
            print("test_register_003用例執行成功")

    def test_register_004(self):
        # 密碼長度小於6
        data = ['Lujier001', '12345']  # 測試數據
        expect_result = {'code': 3, 'msg': '密碼長度須在6-20內'}  # 預期結果
        actual_result = register(*data)  # 測試結果
        try:
            self.assertEqual(actual_result, expect_result)
        except Exception as msg:
            print("test_register_004測試失敗,原因:{}!".format(msg))
            raise msg
        else:
            print("test_register_004用例執行成功")

    def test_register_005(self):
        # 密碼長度大於20
        data = ['Lujier001', '123456789012345678901']  # 測試數據
        expect_result = {'code': 3, 'msg': '密碼長度須在6-20內'}  # 預期結果
        actual_result = register(*data)  # 測試結果
        try:
            self.assertEqual(actual_result, expect_result)
        except Exception as msg:           
            print("test_register_005測試失敗,原因:{}!".format(msg))
            raise msg
        else:
            print("test_register_005用例執行成功")

    def test_register_006(self):
        # 成功註冊
        data = ['Lujier001', '1234567']  # 測試數據
        expect_result = {'code': 0, 'msg': '註冊成功'}  # 預期結果
        actual_result = register(*data)  # 測試結果
        try:
            self.assertEqual(actual_result, expect_result)
        except Exception as msg:
            print("test_register_006測試失敗,原因:{}!".format(msg))
            raise msg
        else:
            print("test_register_006用例執行成功")

4  .  用例寫好了,那麼就到該如何運行用例了

第一種:可以直接在測試用例文件中運行


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

結果如下:

 

第二種:

將多個用例集合在一起,然後再進行運行

1) 新建一個py文件,用來做運行用例文件:run_suite.py

2) # 創建一個測試套件

       suite = unittest.TestSuite()

    # 加載測試用例,  共有4種方法

    

# 第一種,單個添加:接受的參數是測試用例對象
suite.addTest(TestRegister("test_register_001"))
suite.addTest(TestRegister("test_register_002"))
suite.addTest(TestRegister("test_register_003"))
suite.addTest(TestRegister("test_register_004"))
suite.addTest(TestRegister("test_register_005"))
suite.addTest(TestRegister("test_register_006"))


# 第二種,一次添加多條用例
suite.addTests([TestRegister("test_register_001"), TestRegister("test_register_002"),
                TestRegister("test_register_003"), TestRegister("test_register_004"),
                TestRegister("test_register_005"), TestRegister("test_register_006")])

# 第三種:一次添加一個測試類(類名不需要加引號)

# 創建一個加載測試測試用例對象
loader = unittest.TestLoader()
# 加載整個測試用例類
suite.addTest(loader.loadTestsFromTestCase(TestRegister))

# 第四種,模塊添加

# 加載測試用例所在模塊
suite.addTest(loader.loadTestsFromModule(test_register))

   3) 用例加載完成之後,就是執行用例了:

       先創建一個runner對象:        runnerr =unittest.TextTestRunner()

       運行:  runner.run(suite)

# 運行測試集合
runner = unittest.TextTestRunner()   # 創建一個runner對象
runner.run(suite)

運行結果如下:

以上,就是最基本的單元測試的過程,後續還會繼續優化單元測試相關信息

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章