接口自動化筆記01:ddt模塊調用數據

簡介

DDT模塊主要用於遍歷測試數據,在一個測試用例方法中,可以循環遍歷入參的所有數據組情況。

  • 適用情況:當測試一個接口,不同的測試入參數據組合時,比如登錄接口,需要驗證不同的情況(賬號錯誤、密碼錯誤、驗證碼錯誤等)

爲什麼使用ddt

起因:
在寫自動化接口測試的過程中,我沿用了之前使用過的的unittest框架,例如在一個case中寫登錄的方法,我希望寫一個登錄的方法,我傳參進入方法,然後進行登錄的接口發送。

例如:

import unittest
login = {"url": "http://test.com", "method": "post"}


class Demo(unittest.TestCase):

    def test_login(self, login_message):
        """登錄的接口方法(簡化)"""
        print("登錄請求 %s" % login_message)


if __name__ == '__main__':
    # 運行這個登錄方法
    Demo().test_login(login)

但是有一個問題,我想傳好幾組參數:登錄正常、賬號異常、密碼錯誤、密碼爲空…好幾種情況,這個時候我想要驗證的話,該怎麼辦呢。
第一種想法:
傳入一個列表,在方法裏進行循環:

import unittest
login_list = [{"url": "http://test.com", "method": "post"}]


class Demo(unittest.TestCase):

    def test_login(self, login_message):
        """登錄的接口方法(簡化)"""
        for i in login_message:
            print("登錄請求 %s" % i)


if __name__ == '__main__':
    Demo().test_login(login_list)

第二種想法:
我在調用登錄方法的時候,根據入參的個數,來多次調用方法:

import unittest
login_list = [{"url": "http://test.com", "method": "post"}]


class Demo(unittest.TestCase):

    def test_login(self, login_message):
        """登錄的接口方法(簡化)"""
        print("登錄請求 %s" % login_message)


if __name__ == '__main__':
    # 運行這個登錄方法
    for i in login_list:
        Demo().test_login(i)

但是我覺得這兩種方法都不太好,於是我找到了ddt這個第三方模塊,通過這個模塊可以比較優雅的解決這個問題。

通過ddt這個模塊,可以將我們準備的數據作爲入參傳遞到方法中,如果是可以迭代的類型,例如list列表這樣可以迭代的數據類型,那就可以自動循環入參。

如果你把下面的代碼中,login_list改回字典類型的單個入參,你會發現仍然可以正常運行,也就是說ddt是能判斷我們入參的數據類型的。
加入ddt後的代碼

import unittest
import ddt
login_list = [{"url": "http://test.com", "method": "post"},
              {"url": "http://csdn.com", "method": "post"}]


@ddt.ddt
class Demo(unittest.TestCase):

    @ddt.data(*login_list)
    def test_login(self, login_message):
        """登錄的接口方法(簡化)"""
        print("登錄請求 %s" % login_message)


if __name__ == '__main__':
    # 運行這個登錄方法
    unittest.main()

如何使用

  1. 添加ddt 模塊(pycharm-setting-project Interpreter,點擊+號搜索ddt添加庫)
  2. 代碼中 import ddt
  3. 需要在運行測試用例的class上加入裝飾器:@ddt.ddt
  4. 需要在運行測試用例的def上,加入裝飾器:@ddt.data(*sampleData)來引用測試數據:sampleData
  5. 需要在運行測試用例的def中,傳入入參數據samData
  • 注:(sampleData爲測試數據集,samData爲ddt自動分割的測試數據組,比如sampleData = [1,2,3] samData就爲單個元素1,2,3;用例會執行三次,每次傳入不同的samData數據)

sample代碼

# coding:utf-8
import ddt
import unittest
 
sampleData = [1,2,3]

@ddt.ddt
class ddtSample(unittest.TestCase):

    def setUp(self):
        pass
 
    @ddt.data(*sampleData)
    def test_ddtSample(self, samData):
        print(data)

    def tearDown(self):
        pass
 
if __name__ == "__main__":
    unittest.main()

實例代碼

# coding:utf-8
import ddt
import unittest
 
# 測試數據
test_data1 = [{"username": "張三", "pwd": "zhangsan"},
             {"username": "李四", "pwd": "lisi"},
             {"username": "王五", "pwd": "wangwu"},
             ]
test_data2 = [{"username": "悟空", "pwd": "wukong"},
             {"username": "悟能", "pwd": "woneng"},
             {"username": "悟淨", "pwd": "wujing"},
             ]
 
@ddt.ddt
class Test(unittest.TestCase):
    def setUp(self):
        print("Start!")
 
    def tearDown(self):
        print("end!")
 
    @ddt.data(*test_data1)
    def test_ddt1(self, data):
        print(data)
 
    @ddt.data(*test_data2)
    def test_ddt2(self, data):
        print(data)
 
 
if __name__ == "__main__":
    unittest.main()

結果

{'pwd': 'zhangsan', 'username': '張三'}
end!
----------------------------------------------------------------------
Start!
Ran 6 tests in 0.001s
{'pwd': 'lisi', 'username': '李四'}

end!
OK
Start!
{'pwd': 'wangwu', 'username': '王五'}
end!
Start!
{'pwd': 'wukong', 'username': '悟空'}
end!
Start!
{'pwd': 'woneng', 'username': '悟能'}
end!
Start!
{'pwd': 'wujing', 'username': '悟淨'}
end!

Process finished with exit code 0
附錄

當初學習ddt時的參考資料地址:
http://www.cnblogs.com/lingzeng86/p/6790827.html
http://www.imooc.com/article/14861
http://blog.csdn.net/u013118036/article/details/45558951

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