1. 程式人生 > >013 python介面 資料驅動ddt

013 python介面 資料驅動ddt

 

 

'''
時間:2018/11/05
目錄: 
  一: 安裝ddt
  二: 禪道登入 
        1 工程結構
        2 unittest檔案
        3 實現功能檔案
        4 執行結果
  三: 使用excel
        1 安裝xlrd
        2 準備測試資料
  四: 禪道登入
1 工程結構 2 unittest檔案 3 實現功能檔案
4 read_excel.py 5 執行結果
'''

 

一: 安裝ddt


1 : 執行輸入"cmd",進入Dos視窗。

2 : 輸入"pip install ddt"(安裝ddt模組)。

 

1 : 輸入"pip list"(檢視安裝的庫)。

2 : 可以看見已經安裝了ddt(1.2.0)。

 

1 : 輸入"pip show ddt"(檢視ddt的資訊)。


二: 禪道登入
  1 工程結構

 

  2 unittest檔案

# coding:utf-8
import unittest
import ddt
import requests

from DataDriver.chandao_login_api import
* data = [{"user": "admin", "psw": "123456", "expect": True}, {"user": "admin2", "psw": "123456", "expect": False}, {"user": "admin", "psw": "123456", "expect": True}, {"user": "admin4", "psw": "123123", "expect": False} ] @ddt.ddt class Test(unittest.TestCase):
def setUp(self): self.session = requests.session() def tearDown(self): self.session.cookies.clear() # 清除快取 - cookies self.session.close() # 去除警告 - 關閉程序 @ddt.data(*data) # *data : 分組傳送 - 字典型別 def test_001(self, testData): strUser = testData["user"] strPass = testData["psw"] strResult = Login(self.session, strUser, strPass) bResult = DecideResult(strResult) self.assertTrue(bResult == testData["expect"]) if __name__ == '__main__': unittest.main()

 

  3 實現功能檔案

# coding:utf-8
import requests


url = "http://127.0.0.1/zentao/user-login.htm"  # url經常變 : 做全域性變數 - 做配置檔案

def Login(session, strUser, strPass):
    '''
    登入禪道
    :param session:     session
    :param strUser:     使用者名稱
    :param strPass:     密碼
    :return:            請求結果 - 服務端
    '''

    body = {
        "account": strUser,
        "password": strPass,
        "keepLogin[]": "on",
        "referer": "/zentao/my.html"
    }
    r = session.post(url, data = body)
    strResult = r.content.decode("utf-8")
    return strResult


def DecideResult(strResult):
    '''
    判斷結果 - 登入禪道
    :param strResult:  請求結果 - 服務端
    :return:           True - 登入成功 
                       Fasle - 登入失敗 
    '''
    if "登入失敗" in strResult:
        print("登入失敗")
        return False
    elif "parent.location" in strResult:
        print("登入成功")
        return True
    else:
        print("登入失敗 - 其他情況")
        return False


if __name__ == '__main__':
    s = requests.session()
    result = Login(s, "admin", "123456")
    DecideResult(result)

 

  4 執行結果

1 :  測試用例全部執行pass。

 

1 :  測試用例有failed。


三: 使用excel
  1 安裝xlrd

1 : 執行輸入"cmd",進入Dos視窗。

2 : 輸入"pip install xlrd"(安裝xlrd模組)。

 

1 : 輸入"pip list"(檢視安裝的庫)。

2 : 可以看見已經安裝了xlrd(1.1.0)。


  2 準備測試資料

 

1 : 建立excel檔案,命名為testData。

2 : 填寫測試資料。

 

四: 禪道登入
  1 工程結構

 


  2 unittest檔案

# coding:utf-8
import unittest
import ddt
import requests
from DataDriver.chandao_login_api import *
from DataDriver.read_excel import ExcelUtil


data = ExcelUtil("testData.xlsx", "Sheet1")
data = data.dict_data()
print(data)

@ddt.ddt
class Test(unittest.TestCase):
    def setUp(self):
        self.session = requests.session()

    def tearDown(self):
        self.session.cookies.clear()    # 清除快取 - cookies
        self.session.close()            # 去除警告 - 關閉程序

    @ddt.data(*data)    # *data : 分組傳送 - 字典型別
    def test_001(self, testData):

        strUser = testData["user"]
        strPass = testData["psw"]
        strResult = Login(self.session, strUser, strPass)
        bResult = DecideResult(strResult)
        self.assertTrue(str(bResult) == testData["expect"])


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

 

  3 實現功能檔案

# coding:utf-8
import requests


url = "http://127.0.0.1/zentao/user-login.htm"  # url經常變 : 做全域性變數 - 做配置檔案

def Login(session, strUser, strPass):
    '''
    登入禪道
    :param session:     session
    :param strUser:     使用者名稱
    :param strPass:     密碼
    :return:            請求結果 - 服務端
    '''

    body = {
        "account": strUser,
        "password": strPass,
        "keepLogin[]": "on",
        "referer": "/zentao/my.html"
    }
    r = session.post(url, data = body)
    strResult = r.content.decode("utf-8")
    return strResult


def DecideResult(strResult):
    '''
    判斷結果 - 登入禪道
    :param strResult:  請求結果 - 服務端
    :return:
    '''
    if "登入失敗" in strResult:
        print("登入失敗")
        return False
    elif "parent.location" in strResult:
        print("登入成功")
        return True
    else:
        print("登入失敗 - 其他情況")
        return False


if __name__ == '__main__':
    s = requests.session()
    result = Login(s, "admin", "123456")
    DecideResult(result)

 

  4 read_excel.py

# coding:utf-8
import xlrd
class ExcelUtil():
    def __init__(self, excelPath, sheetName="Sheet1"):
        self.data = xlrd.open_workbook(excelPath)
        self.table = self.data.sheet_by_name(sheetName)

        # 獲取第一行作為key值
        self.keys = self.table.row_values(0)
        # 獲取總行數
        self.rowNum = self.table.nrows
        # 獲取總列數
        self.colNum = self.table.ncols

    def dict_data(self):
        if self.rowNum <= 1:
            print("總行數小於1")
        else:
            r = []
            j=1
            for i in range(self.rowNum-1):
                s = {}
                # 從第二行取對應values值
                values = self.table.row_values(j)
                for x in range(self.colNum):
                    s[self.keys[x]] = values[x]
                r.append(s)
                j+=1
            return r

if __name__ == "__main__":
    filepath = "testData.xlsx"
    sheetName = "Sheet1"
    data = ExcelUtil(filepath, sheetName)
    print(data.dict_data())

 

  5 執行結果

1 :  測試用例全部執行pass。

 

1 :  測試用例有failed。