2012-12-15 49 views
1

我已經使用testNG/Maven/Springs RestTemplate設置了一個測試HTTP REST應用程序的項目。testng - HTTP REST測試背後登錄

我用它來做功能測試,多個對REST應用程序的調用包含在套件中以模仿用戶進程。

這工作正常。

知道我們已經打開驗證。

問題是如何用testNG做到這一點?我如何(只有一次)登錄我的測試套件。

我可以使用@BeforeSuite並調用登錄頁面,登錄並捕獲所有其他請求所需的cookie。但是,我在哪裏存儲這個cookie,以便所有的測試用例都可以添加它? 我一定要向測試中添加一些代碼,以添加當然的cookie ......但是,我如何理解這一點?

我看着@parameter和@dataProvider,但這些似乎並沒有幫助我很多......

任何幫助/建議是非常讚賞。

回答

0

如果您在Spring Security上委託登錄,並且您的後端不存儲狀態(意味着僅授權隔離的請求),則無需對其進行測試。這意味着您可以在測試中禁用身份驗證(cookie獲取)。這樣您可以將測試本身與授權分離。

但是,如果你不想這樣做。如果你在套件中組織你的測試,你可以設置一個私人成員。該響應中的cookie將爲header auth

@TestSuite 
public void mySuite { 

    private String cookie; 

    @BeforeSuite public void login() { 
     // Obtain cookie 
     this.cookie = cookie; 
    } 
////// Rest of suite 

另一種看待它的方法是執行登錄作爲測試的一部分。

我不知道任何其他更優雅的做法。

+0

感謝您的回答。任何想法如何檢索我的測試類中的cookie?所有的測試都在與該組註釋的不同類別內。非常感激。 – user1907019

0

我已經創建了一個可行的解決方案。

我所做的是使用單例對象和@dataprovider來獲取數據以進行測試: 數據提供者創建一個單例對象。 單身對象在其創建中調用登錄頁面,並且在來自不同測試的每次調用之後都會返回cookie信息。

也許這是一個黑客,但它的作品。

0

Singleton解決方案有點過於霸道,因爲它可以防止未來任何測試的並行化。

有一些方法可以解決這個問題。一個是一個ITestContext實例傳遞給您的@ BeforeSuite/@ BeforeTest和@BeforeClass配置方法,並把/通過在每個實例的測試場景中獲得的參數:

public class Test { 

    /** Property Foo is set once per Suite */ 
    protected String foo; 

    /** Property Foo is set once per Test */ 
    protected String bar; 

    /** 
    * As this method is executed only once for all inheriting instances before the test  suite starts this method puts 
    * any configuration/resources needed by test implementations into the test context. 
    * 
    * @param context test context for storing test conf data 
    */ 
    @BeforeSuite 
    public void beforeSuite(ITestContext context) { 
     context.setAttribute("foo", "I was set in @BeforeSuite"); 
    } 

    /** 
    * As this method is executed only once for all inheriting instances before the test starts this method puts any 
    * configuration/resources needed by test implementations into the test context. 
    * 
    * @param context test context for storing test conf data 
    */ 
    @BeforeTest(alwaysRun = true) 
    public void beforeTest(ITestContext context) { 
     context.setAttribute("bar", "I was set in @BeforeTest"); 
    } 

    /** 
    * This method is run before the first method of a test instance is started and gets all required configuration from 
    * the test context. 
    * 
    * @param context test context to retrieve conf data from. 
    */ 
    @BeforeClass 
    public void beforeClass(ITestContext context) { 
     foo = (String) context.getAttribute("foo"); 
     bar = (String) context.getAttribute("bar"); 

    } 
} 

此解決方案即使@ BeforeSuite /測試/ Class方法在實際測試實現的超類中。