2017-02-25 64 views
-2

我使用Python請求和機器人框架,以使我的自動化測試用例,我有使用要求LIB創造了很多測試方法,如登錄,註銷等一類,這些方法作爲測試用例的關鍵字,現在我很困惑在哪裏初始化的requests.Session(),因爲測試的情況下運行的這兩個解決方案如下決議:何時創建蟒蛇請求會話對象

解決方案1:初始化在類的init方法requests.Session()

import requests 

class MyHttpBase(): 
    def __init__(self): 
     self.s = requests.Session() 

    def login(self, login_user, password): 
     data = {'username': login_user, 'password': password} 
     return self.s.post('http://example.com/login', data=data) 

    def logout(self): 
     resp = self.s.get('http://example.com/logout') 
     return resp 

解決方案2:初始化在類的登錄方法的requests.Session()

import requests 

class MyHttpBase(): 
    def __init__(self): 
     self.s = None 

    def login(self, login_user, password): 
     self.s = requests.Session() 
     data = {'username': login_user, 'password': password} 
     return self.s.post('http://example.com/login', data=data) 

    def logout(self): 
     resp = self.s.get('http://example.com/logout') 
     self.s.close() 
     return resp 

我只是想確保登錄用戶具有測試執行過程中只有一個會話,但在我的一些測試用例,測試步驟包括多個用戶登錄的步驟,例如:

測試用例例如:

  • 步驟1:用戶A登錄和做某事然後註銷
  • 步驟2:用戶B登錄和做某事然後註銷
  • ...

如果我把requests.session到類的init方法,用戶A和用戶B具有相同的會話對象。 如果我將requests.session放入登錄方法中,那麼requests.session在類的init方法中設置爲None,這並不好。

難道還有其他的解決方案或建議?

+1

能否請仔細閱讀StackOverflow的指導創建[最小的,完整的和可覈查的示例](http://stackoverflow.com /幫助/ mcve)並增強您的問題?在目前的狀態下,它太模糊,不會向您提供您正在尋找的答案。 –

+0

對不起,我已經編輯了問題,希望有少數的登錄帳戶,如果requests.session是在類__init__方法這是不夠 – yyzhang14922

回答

0

在解決方案1: 因爲會話對象在__init__方法中,所以在實例化MyHttpdatabase對象時會創建會話對象。 varialbe「s」的類型爲requests.session

solution2: 因爲會話對象位於__init__方法中,所以s爲NoneType,因爲沒有分配給它。一旦你調用登錄方法,會話對象被創建並分配給s。

好的做法是讓你的類的實例應該在__init__方法,以避免它是noneType。所以解決方案1是做到這一點的正確方法。

編輯爲您更新的問題:

class MyHttpBase(): 
def __init__(self): 
    self.s = requests.Session() 

def login(self, login_user, password): 
    data = {'username': login_user, 'password': password} 
    return self.s.post('http://example.com/login', data=data) 

def logout(self): 
    resp = self.s.get('http://example.com/logout') 
    self.s.close() 
    return resp 


a=MyHttpBase() 
b=MyHttpBase() 
a.login(user1,pass1) 
b.login(user2,pass2) 
a.logout() 
b.logout() 

a和b類MyHttpBase的單獨的實例。並作爲和BS是獨立實例的成員變量(而不是靜態varibale成爲所有實例相同)

+0

清楚,所有的用戶將使用相同的會話,因爲機器人框架只是加載類只有一次。 – yyzhang14922

+0

是的。爲什麼要在不打算執行並行執行時創建同一類的多個實例?也確保這個答案有助於你的解決方案。如果沒有,請更新你的問題。 – DevD

+0

謝謝,我編輯了我的問題,請再看一遍。 – yyzhang14922