2013-11-01 1 views
0

Я работаю над реализацией API RESTful на основе Play 2.0 и когда я пытаюсь запустить тестовые примеры (операции CRUD), я вижу POSTED (успешный ответ 201) недоступен, когда я выполняю операцию GET в следующем тестовом случае.Play Test - проблемы с сохранением данных - POSTed данные недоступны при использовании GET

Пожалуйста, обратите внимание на мой JUnit тестовый класс -

public class TagTest { 

public static FakeApplication app; 

private static String AUTH_HEADER = "Authorization"; 
private static String AUTH_VALUE = "Basic a25paadsfdfasdfdsfasdmeSQxMjM="; 
private static int tagId = 0; 

private static Map<String, String> postDataMap = new HashMap<String, String>(); 
private static Map<String, String> updateDataMap = new HashMap<String, String>(); 
private static String searchText = null; 

@BeforeClass 
public static void setUpBeforeClass() { 
    // Set up new FakeApplication before running any tests 
    app = Helpers.fakeApplication(); 
    Helpers.start(app); 
    postDataMap.put("text", "Created"); 
    updateDataMap.put("text", "Updated"); 
    searchText = "Date"; // case insensitive substring pattern for "Updated" 
} 

@Test 
public void createTagTest() { 
    app = Helpers.fakeApplication(); 

    running(fakeApplication(), new Runnable() { 
     public void run() { 
      JsonNode json = Json.toJson(postDataMap); 

      FakeRequest request=new FakeRequest().withJsonBody(json); 
      Result result = callAction(controllers.routes.ref.Application.createTag(),request.withHeader(TagTest.AUTH_HEADER, TagTest.AUTH_VALUE)); 

      Map<String, String> headerMap = Helpers.headers(result); 
      String location = headerMap.get(Helpers.LOCATION); 
      String tagIdStr = location.replace("/tags/",""); 
      try { 
       tagId = Integer.parseInt(tagIdStr); 
       assertThat(status(result)).isEqualTo(Helpers.CREATED); 
       System.out.println("Tag Id : "+tagId+" Location : "+headerMap.get(Helpers.LOCATION)); // Here I'm getting resource URI from API which means it is successful run 

      } catch (NumberFormatException e) { 
       System.out.println("Inside NumberFormatException"); 
       e.printStackTrace(); 
       assertThat(0).isEqualTo(1); 
      } 
      System.out.println("createTagTest is successful"); 
     } 
    }); 
} 

@Test 
public void getTagTest() { 
    app = Helpers.fakeApplication(); 

    running(fakeApplication(), new Runnable() { 
     public void run() { 
      FakeRequest request = new FakeRequest(); 
      Result result = callAction(controllers.routes.ref.Application.getTag(tagId), request.withHeader(TagTest.AUTH_HEADER, TagTest.AUTH_VALUE)); 
      String content = contentAsString(result); 
      if(content.length()==0) { 
       assertThat(status(result)).isEqualTo(Helpers.NO_CONTENT); 
      } else { 
       assertThat(status(result)).isEqualTo(Helpers.OK); 
      } 
      System.out.println("getTagTest is successful"); 
     } 
    }); 
} 

@Test 
public void updateTagTest() { 
    app = Helpers.fakeApplication(); 

    running(fakeApplication(), new Runnable(){ 
     public void run() { 
      JsonNode json = Json.toJson(updateDataMap); 
      FakeRequest request = new FakeRequest().withJsonBody(json); 
      Result result = callAction(controllers.routes.ref.Application.updateTag(tagId), 
             request.withHeader(TagTest.AUTH_HEADER, TagTest.AUTH_VALUE)); 
      assertThat(status(result)).isEqualTo(Helpers.OK); 
      System.out.println("updateTagTest is successful"); 
     } 
    }); 
} 

@Test 
public void getAllTagsTest() { 
    app = Helpers.fakeApplication(); 

    running(fakeApplication(), new Runnable() { 
     public void run() { 
      FakeRequest request = new FakeRequest(); 
      Result result = callAction(controllers.routes.ref.Application.getAllTags(null), request.withHeader(TagTest.AUTH_HEADER, TagTest.AUTH_VALUE)); 
      String content = contentAsString(result); 
      System.out.println(content); 
      if(content.length()==0) { 
       System.out.println("No content"); 
       assertThat(status(result)).isEqualTo(Helpers.NO_CONTENT); 
      } else { 
       System.out.println("Content"); 
       assertThat(status(result)).isEqualTo(Helpers.OK); 
      } 
      System.out.println("getAllTagsTest is successful"); 
     } 
    }); 
} 

@Test 
public void getTagsByTextTest() { 
    app = Helpers.fakeApplication(); 

    running(fakeApplication(), new Runnable() { 
     public void run() { 
      FakeRequest request = new FakeRequest(); 
      Result result = callAction(controllers.routes.ref.Application.getAllTags(searchText), request.withHeader(TagTest.AUTH_HEADER, TagTest.AUTH_VALUE)); 
      String content = contentAsString(result); 
      if(content.length()==0) { 
       assertThat(status(result)).isEqualTo(Helpers.NO_CONTENT); 
      } else { 
       assertThat(status(result)).isEqualTo(Helpers.OK); 
      } 
      System.out.println("getAllTagsByTextTest is successful"); 
     } 
    }); 
} 

@Test 
public void deleteTagTest() { 
    app = Helpers.fakeApplication(); 

    running(fakeApplication(), new Runnable() { 
     public void run() { 
      FakeRequest request = new FakeRequest(); 
      Result result = callAction(controllers.routes.ref.Application.deleteTag(tagId), request.withHeader(TagTest.AUTH_HEADER, TagTest.AUTH_VALUE)); 
      assertThat(status(result)).isEqualTo(Helpers.OK); 
      System.out.println("deleteTagTest is successful"); 
     } 
    }); 
} 

@AfterClass 
public static void tearDownAfterClass() { 
    // Stop FakeApplication after all tests complete 
    Helpers.stop(app); 
} 
} 

Когда я запустить тест, Tag создан, но он не был подобран в последующем испытании при попытке сделать GET/теги/1 и привело к отсутствию контента.

Пожалуйста, бросьте какой-то свет, что может быть причиной этого. Еще одно замечание: вчера оно работало, и внезапно этот вопрос вошел в картину.

Отличная помощь, если кто-то может помочь мне решить эту проблему.

+0

Я вижу, что база данных памяти, которую я использую, может быть обновлена ​​для каждого тестового примера, который я запускаю в приложении. Когда я использую не-в памяти DB (например, MySQL), тесты работают нормально. Все еще нужно исследовать, почему данные обновляются, для каждого тестового прогона в IMDB. –

ответ

0

JUnit не поддерживает упорядоченную последовательность методов тестирования. Это особенность - не ошибка. Тесты должны быть независимыми. В результате вы не можете гарантировать, что getTagTest поступит после createTagTest. Иногда это будет; иногда это не так.

Отдельные операции должны иметь свои собственные испытательные приборы с соответствующими предварительными условиями, определенными с помощью @BeforeClass.

Если вы настаиваете на определенном порядке, используйте dependsOnMethods в TestNG.

+0

Спасибо, Видья! Ваша точка верна, но когда я наблюдаю журнал консоли, я вижу, что тестовые прогоны выполняются в порядке методов, объявленных в классе. Не уверен, что журнал отображает результаты в произвольном порядке. –

+0

Я вижу, что база данных с памятью, которую я использую, может быть обновлена ​​для каждого тестового примера, который я запускаю в приложении. Когда я использую не-в памяти DB (например, MySQL), тесты работают нормально. Все еще нужно исследовать, почему данные обновляются, для каждого тестового прогона в IMDB. –

Смежные вопросы