2013-06-14 3 views
2

Конфигурация: Maven 3, объективировать, Google-Appengine, Java 7Автоматическое создание индексов хранилища данных в блоке тестов

Я хотел бы найти способ автоматического генерирования индексов (в datastore-indexes-auto.xml) с использованием только модульных тестов. Однако, хотя тесты вызывают запрос хранилища данных, файл не генерируется.

В моем проекте я использую стандартный Maven макет:

src/ 
    main/ 
    test/ 
target/ 

При выполнении моих модульных тестов с Maven, не datastore-indexes-auto.xml файл не создается (по крайней мере, я не могу найти его в любом месте в каталоге проекта) , Конечно, все тесты проходят.

Есть ли способ генерировать индексы автоматически, используя только модульные тесты?

Вот pom.xml файл (обновляется на основе правильного ответа):

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>com.something.example</groupId> 
    <artifactId>example</artifactId> 
    <version>0.1-SNAPSHOT</version> 
    <packaging>war</packaging> 
    <name>Example</name> 
    <description>Example POM for my appengine project.</description> 
    <properties> 
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
    <gae.version>1.8.1</gae.version> 
    <objectify.version>4.0rc1</objectify.version> 
    <java.version>1.7</java.version> 
    </properties> 
    <build> 
    <plugins> 
     <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-compiler-plugin</artifactId> 
     <version>2.3.2</version> 
     <configuration> 
      <source>${java.version}</source> 
      <target>${java.version}</target> 
     </configuration> 
     </plugin> 
     <plugin> 
     <groupId>com.google.appengine</groupId> 
     <artifactId>appengine-maven-plugin</artifactId> 
     <version>${gae.version}</version> 
     <configuration> 
      <oauth2>false</oauth2> 
      <address>0.0.0.0</address> 
     </configuration> 
     </plugin> 
     <!-- UPDATE: Based on @Amir's answer, I have added this plugin in order to 
     -- copy the generated index file to the webapp directory. --> 
     <plugin> 
     <artifactId>maven-resources-plugin</artifactId> 
     <version>2.6</version> 
     <executions> 
      <execution> 
      <id>copy-resources</id> 
      <phase>test</phase> 
      <goals> 
       <goal>copy-resources</goal> 
      </goals> 
      <configuration> 
       <outputDirectory>${basedir}/target/${project.artifactId}-${project.version}/WEB-INF/appengine-generated</outputDirectory> 
       <resources> 
       <resource> 
        <directory>${basedir}/WEB-INF/appengine-generated</directory> 
        <filtering>false</filtering> 
       </resource> 
       </resources> 
      </configuration> 
      </execution> 
     </executions> 
     </plugin> 
     <!-- UPDATE: This will remove the genreated WEB-INF directory with the mvn clean 
     -- command. --> 
     <plugin> 
     <artifactId>maven-clean-plugin</artifactId> 
     <version>2.5</version> 
     <configuration> 
      <filesets> 
      <fileset> 
       <directory>WEB-INF</directory> 
      </fileset> 
      </filesets> 
     </configuration> 
     </plugin> 
    </plugins> 
    </build> 
    <dependencies> 
    <dependency> 
     <groupId>javax.servlet</groupId> 
     <artifactId>servlet-api</artifactId> 
     <version>2.5</version> 
     <type>jar</type> 
     <scope>provided</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.projectlombok</groupId> 
     <artifactId>lombok</artifactId> 
     <version>0.11.8</version> 
     <scope>provided</scope> 
    </dependency> 
    <dependency> 
     <groupId>com.googlecode.objectify</groupId> 
     <artifactId>objectify</artifactId> 
     <version>${objectify.version}</version> 
    </dependency> 
    <!-- GAE --> 
    <dependency> 
     <groupId>com.google.appengine</groupId> 
     <artifactId>appengine-api-1.0-sdk</artifactId> 
     <version>${gae.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <version>4.11</version> 
     <scope>test</scope> 
    </dependency> 
    <dependency> 
     <groupId>com.google.appengine</groupId> 
     <artifactId>appengine-api-labs</artifactId> 
     <version>${gae.version}</version> 
     <scope>test</scope> 
    </dependency> 
    <dependency> 
     <groupId>com.google.appengine</groupId> 
     <artifactId>appengine-api-stubs</artifactId> 
     <version>${gae.version}</version> 
     <scope>test</scope> 
    </dependency> 
    <dependency> 
     <groupId>com.google.appengine</groupId> 
     <artifactId>appengine-testing</artifactId> 
     <version>${gae.version}</version> 
     <scope>test</scope> 
    </dependency> 
    <dependency> 
     <groupId>httpunit</groupId> 
     <artifactId>httpunit</artifactId> 
     <version>1.7</version> 
     <scope>test</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.mozilla</groupId> 
     <artifactId>rhino</artifactId> 
     <version>1.7R4</version> 
     <scope>test</scope> 
    </dependency> 
    <dependency> 
     <groupId>joda-time</groupId> 
     <artifactId>joda-time</artifactId> 
     <version>2.2</version> 
    </dependency> 
    <dependency> 
     <groupId>org.mockito</groupId> 
     <artifactId>mockito-core</artifactId> 
     <version>1.9.5</version> 
     <scope>test</scope> 
    </dependency> 
    </dependencies> 
</project> 
+0

Можете ли вы опубликовать ваш пом .xml или может быть ссылка на проект, такой как github и т. д.? – khmarbaise

+0

Репозиторий проекта не является общедоступным, но я опубликовал 'pom.xml' сейчас. –

ответ

2

Я получил его на работу в одну сторону. Это немного хаки, но похоже, что это работает.

Обратите внимание, что выполнение этой работы имеет мало общего с maven. Ключом является настройка локальной службы хранилища данных для генерации индексов хранилища-auto.xml.

Шаг 1: Измените конфигурацию тестового сервиса локального хранилища данных, чтобы установить значениеNoIndexAutoGen (false). Кроме того, вам, к сожалению, нужно прокомментировать вызов LocalServiceTestHelper tearDown(), если вы хотите, чтобы «datastore-indexes-auto.xml» содержал все индексы, необходимые для ваших тестов.

Обратите внимание, что все мои тесты хранилища данных наследуются от PersistenceTestHelper. Так что это, как я изменил его:

public class PersistenceTestHelper { 

    private LocalServiceTestHelper appEngineHelper; 

    @Before 
    public void setUp() throws Exception { 
    LocalDatastoreServiceTestConfig dsConfig = new LocalDatastoreServiceTestConfig(); 
    dsConfig.setNoIndexAutoGen(false); 
    appEngineHelper = new LocalServiceTestHelper(dsConfig); 
    appEngineHelper.setUp(); 
    ... 
    } 

    @After 
    public void tearDown() throws Exception { 
    // appEngineHelper.tearDown(); 
    } 
} 

Шаг 2: Выполнить «МВН тест»

Шаг 3: В каталоге вы выполняется «тест МВН» искать WEB-INF суб -directory. Там вы найдете «WEB-INF/appengine-generated/datastore-indexes-auto.xml». Это каталог проекта/pom.xml независимо.

$ pwd 
/home/avaliani/src/karma-exchange 
$ mvn test 
... 
$ cat WEB-INF/appengine-generated/datastore-indexes-auto.xml 
<!-- Indices written at Tue, 2 Jul 2013 03:52:26 UTC --> 

<datastore-indexes> 

    <!-- Used 1 time in query history --> 
    <datastore-index kind="Review" ancestor="true" source="auto"> 
     <property name="+commentCreationDate" direction="asc"/> 
    </datastore-index> 

    <!-- Used 1 time in query history --> 
    <datastore-index kind="Review" ancestor="true" source="auto"> 
     <property name="commentCreationDate" direction="desc"/> 
    </datastore-index> 

</datastore-indexes> 

Детали: Я использую "Apache Maven 3.0.4" и App Engine SDK 1.7.7. Мой проект интегрирован с Maven плагин в App Engine: https://developers.google.com/appengine/docs/java/tools/maven

Мой pom.xml: https://github.com/karma-exchange-org/karma-exchange/blob/master/pom.xml

+0

Это хороший подход.Я изменил свой POM, чтобы автоматически копировать сгенерированный файл в целевой Webapp. –

+0

Я хочу использовать ту же конфигурацию без использования mvn, возможно ли это? –

+0

Это должно быть, если вы используете LocalServiceTestHelper (https://developers.google.com/appengine/docs/java/tools/localunittesting). Перечисленные выше изменения касаются настройки тестового помощника, так что информация об использовании индекса сохраняется. – Amir

0

Вы пробовали иметь свой файл datastore-indexes.xml как нечто вида:

<?xml version="1.0" encoding="UTF-8"?> 
<datastore-indexes autoGenerate="true"> 
</datastore-indexes> 
Смежные вопросы