記錄python介面自動化測試--unittest框架基本應用(第二目)

我是冰霜發表於2018-03-26

在第一目裡寫了幾個簡單demo,並把呼叫get和post請求的方法封裝到了一個類裡,這次結合python自帶的unittest框架,用之前封裝的方法來寫一個介面測試demo

1.unittest簡單用法

# -*-coding:UTF:8-*-

import unittest


class TestMethod(unittest.TestCase):  # 定義一個類,繼承自unittest.TestCase
    # 每次執行用例前執行setUp(),可以在這裡做一些初始化的工作
    def setUp(self):
        print('setUp')

    # 每次執行用例後執行tearDown
    def tearDown(self):
        print('tearDown')

    def test001(self):  # unittest中的用例必須以test開頭
        print('test001')

    def test002(self):
        print('test002')


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

執行結果如下:

 如果不想在每次執行用例時都執行一遍setUp()和tearDown(),只要執行一次就好,可以使用類方法代替:

# -*-coding:UTF:8-*-

import unittest


class TestMethod(unittest.TestCase):  # 定義一個類,繼承自unittest.TestCase
    # 每次執行用例前執行setUp(),可以在這裡做一些初始化的工作
    @classmethod     
    def setUpClass(cls):
        print('setUp\n')

    # 每次執行用例後執行tearDown
    @classmethod
    def tearDownClass(cls):
        print('tearDown')

    def test001(self):  # unittest中的用例必須以test開頭
        print('test001')

    def test002(self):
        print('test002')


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

執行結果如下:

 2.介面測試例項

# -*-coding:UTF:8-*-

import unittest
from interface.demo import RunMain   # 從之前封裝的檔案中,引入RunMain類
import HTMLTestRunner
import json


class TestMethod(unittest.TestCase):    # 定義一個類,繼承自unittest.TestCase

    def setUp(self):
        self.run = RunMain()   # 在初始化方法中例項化get/post基類,生成一個例項物件,這樣就不需要在每個用例中再進行例項化了

    def test01(self):
        url = 'http://localhost:7001/XXX'
        data = {
            'controlSeq': '2018118325'
        }
        r = self.run.run_main(url, 'POST', data)   # 呼叫RunMain類中run_main方法
        print(r)
        re = json.loads(r)
        self.assertEqual(re['status'], '200', '測試失敗')
#注意我在進行斷言前,先用json庫的json.loads()函式對上一步中的返回結果r進行了解碼,不然直接呼叫r['status']時會報錯“json.loadsstring indices must be integers”
#原因是,在之前的例子中,為了使顯示效果更加直觀,對伺服器的響應結果利用json.dumps()進行了json格式的編碼

def test02(self): url = 'http://localhost:7001/XXX' data = { "controlSeq": "2018118325" } r = self.run.run_main(url, 'GET', data) print(r) re = json.loads(r) self.assertEqual(re["status"], '200', '測試失敗') # @unittest.skip('test03') # 使用skip()方法表示跳過用例test03 def test03(self): url = 'http://localhost:7001/XXX' data = { 'controlSeq': '2018118361', 'seq': '2939', 'type': '1' } r = self.run.run_main(url, 'POST', data) print(r) # print(type(r)) # 檢視返回物件r的型別 re = json.loads(r) # print(type(re)) self.assertEqual(re['status'], '200', '測試失敗') if __name__ == "__main__": unittest.main() #表示執行全部用例

 3.使用TestSuite()來自定義執行case

# -*-coding:UTF:8-*-

import unittest
from interface.demo import RunMain   # 從之前封裝的檔案中,引入RunMain類
import HTMLTestRunner
import json


class TestMethod(unittest.TestCase):    # 定義一個類,繼承自unittest.TestCase

    def setUp(self):
        self.run = RunMain()   # 在初始化方法中例項化get/post基類,生成一個例項物件,這樣就不需要在每個用例中再進行例項化了

    def test01(self):
        url = 'http://localhost:7001/XXX'
        data = {
            'controlSeq': '2018118325'
        }
        r = self.run.run_main(url, 'POST', data)   # 呼叫RunMain類中run_main方法
        print(r)
        re = json.loads(r)
        self.assertEqual(re['status'], '200', '測試失敗')
        # globals()['userid'] = 22   #定義全域性變數

    def test02(self):
        # print(userid)   #使用case1中的全域性變數,執行時需要全部執行,不能只執行後面的,不然會報錯
        url = 'http://localhost:7001/XXX'
        data = {
            "controlSeq": "2018118325"
        }
        r = self.run.run_main(url, 'GET', data)
        print(r)
        re = json.loads(r)
        self.assertEqual(re["status"], '200', '測試失敗')

    # @unittest.skip('test03')  # 跳過用例test03
    def test03(self):
        url = 'http://localhost:7001/XXX'
        data = {
            'controlSeq': '2018118361',
            'seq': '2939',
            'type': '1'
        }
        r = self.run.run_main(url, 'POST', data)
        print(r)
        # print(type(r)) # 檢視返回物件r的型別
        re = json.loads(r)
        # print(type(re))  #檢視json物件解碼後的型別
        self.assertEqual(re['status'], '200', '測試失敗')


if __name__ == "__main__":    
suite = unittest.TestSuite() # 呼叫unittest的TestSuite(),理解為管理case的一個容器(測試套件) suite.addTest(TestMethod('test01')) # 向測試套件中新增用例,"TestMethod"是上面定義的類名,"test01"是用例名 suite.addTest(TestMethod('test02')) suite.addTest(TestMethod('test03')) runner = unittest.TextTestRunner() runner.run(suite) # 執行套件中的用例
此時再執行這個檔案,就只會執行新增到測試套件中的case了

但是如果是使用的pycharm來執行指令碼,則有幾點需要注意,pycharm這裡有個坑,困擾了我很久,在第三目中的小總結中說一下

 

相關文章