2012-12-15 4 views
1

testNG/Maven/Springs RestTemplate을 사용하여 HTTP REST 애플리케이션을 테스트하기위한 프로젝트를 설정했습니다.testng - 로그인 뒤의 HTTP REST 테스트

기능 테스트에는 REST 애플리케이션에 대한 여러 번의 호출이 사용자 프로세스를 모방 한 스위트 내에 포함되어 있습니다.

괜찮습니다.

인증을 사용하고있는 것으로 알고 있습니다.

질문은 testNG로 어떻게해야합니까? 내 테스트 스위트에 대해 어떻게 한 번만 로그인 할 수 있습니까?

@BeforeSuite를 사용하고 loginpage를 호출하고 로그인하여 다른 모든 요청에 ​​필요한 쿠키를 잡을 수 있습니다. 하지만 모든 쿠키를 추가 할 수 있도록이 쿠키를 어디에 저장해야합니까? 나는 propably 코스의 쿠키를 추가하는 테스트에 몇 가지 코드를 추가해야 ....하지만 어떻게 잡아?

나는 @parameter와 @dataprovider에 보였다, 그러나이 나에게 많이 ...

어떤 도움/제안

이 많이 감사합니다 도움이되지 것 같다.

답변

0

Spring Security에 로그인을 위임하고 백엔드가 상태를 저장하지 않으면 (격리 된 요청 만 승인한다는 의미입니다) 테스트하지 않아도됩니다. 즉, 테스트에서 인증 (쿠키 획득)을 비활성화 할 수 있습니다. 이렇게하면 테스트 자체를 인증과 분리 할 수 ​​있습니다.

하지만 이렇게하고 싶지 않으면. 그리고 스위트 룸에서 테스트를 구성한다면 비공개 멤버를 설정할 수 있습니다. 쿠키는 응답에 header auth이됩니다.

@TestSuite 
public void mySuite { 

    private String cookie; 

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

또 다른 방법은 테스트의 일부로 로그인을 실행하는 것입니다.

다른 방법으로는 더 잘 할 수 없습니다.

+0

답해 주셔서 감사합니다. 내 테스트 클래스에서 쿠키를 검색하는 방법에 대한 아이디어가 있습니까? 모든 테스트는 그룹으로 주석이 달린 다른 클래스 내에 있습니다. 매우 감사. – user1907019

0

나는 실행 가능한 솔루션을 만들었습니다.

내가 한 것은 싱글 톤 객체와 @dataprovider를 사용하여 테스트 할 데이터를 얻는 것입니다. dataprovider가 싱글 톤 객체를 만듭니다. 싱글 톤 객체는 생성시 로그인 페이지를 호출하고 서로 다른 테스트의 모든 호출이 쿠키 정보를 반환 할 때마다 로그인 페이지를 호출합니다.

어쩌면 해킹 비트 일 수도 있지만 작동합니다.

0

싱글 톤 솔루션은 미래의 테스트 병렬 처리를 막기 때문에 다소 무거운 것이 좋습니다.

이 문제를 해결할 수있는 몇 가지 방법이 있습니다.

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/테스트하면 작동 : 하나는 모든 인스턴스에서 테스트 컨텍스트를 통해 매개 변수를 얻을 수/당신 @ BeforeSuite/@ BeforeTest 및 @BeforeClass 구성 방법에 ITestContext 인스턴스를 전달하고 배치하는 것입니다/Class 메소드는 실제 테스트 구현의 수퍼 클래스에 있습니다.