Как правильно добавить ресурсы в мой проект Java, чтобы они были доступны для встроенного экземпляра? - PullRequest
0 голосов
/ 18 июня 2019

Я не могу создать «решение», которое работает с ресурсами в моем проекте.Когда я запускаю тест во время сборки, он, естественно, может получить доступ к ресурсам, но после сборки тест не может найти файл.Как настроить мой код так, чтобы он работал в обоих случаях, или настроить мой проект.Мне интересно узнать основы настройки Java-проекта в этой связи, в дополнение к моей конкретной ситуации с использованием плагина maven-shade, позволяющего время.

Я пробовал различные варианты пути без удачи

Я пробовал getClass (). ClassLoader, тот и тот без удачи.

Мой 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>company.myproj</groupId>
  <artifactId>myproj</artifactId>
  <version>0.0.1</version>
  <packaging>jar</packaging>

    <properties>
       <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
       <skipTests>true</skipTests>
  </properties>
    <dependencies>
        <!-- https://mvnrepository.com/artifact/org.testng/testng -->
        <dependency>
            <groupId>org.testng</groupId>
            <artifactId>testng</artifactId>
            <version>7.0.0-beta3</version>
            <!-- <scope>provided</scope> -->
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java -->
        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-java</artifactId>
            <version>3.141.59</version>
            <!-- <scope>provided</scope> -->
        </dependency>

    </dependencies>


    <build>

        <!-- Source directory configuration -->
        <sourceDirectory>src</sourceDirectory>

        <resources>
                <resource>    
                    <directory>src/resources</directory>
                </resource>
        </resources>

        <plugins>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>


                <!-- // Following plugin executes the testng tests  -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.14.1</version>
                <configuration>
                    <!-- // Suite testng xml file to consider for test execution  -->
                    <suiteXmlFiles>
                        <suiteXmlFile>testtest.xml</suiteXmlFile>
                    </suiteXmlFiles>
                      <skipTests>${skipTests}</skipTests>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>3.2.1</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <filters>
                                <filter>
                                    <artifact>*:*</artifact>
                                    <excludes><exclude>META-INF/versions/**</exclude></excludes>
                                </filter>
                            </filters>
                            <transformers>
                                <transformer
                                        implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                    <mainClass>org.testng.TestNG</mainClass>
                                </transformer>
                            </transformers>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

        </plugins>
     </build>

</project>

Мой java

package myproj;

import java.io.IOException;
import java.net.URISyntaxException;
import java.nio.file.Path;
import java.nio.file.Paths;

import org.testng.annotations.Test;

public class TestTest{

    @Test(groups = { "basic1" })
    public void Test05BasicPASS() throws URISyntaxException, IOException {


        Path filePath = Paths.get(getClass().getResource("/images/hydrant.jpg").toURI());


        System.out.println("My Path is: "+filePath.toString());


        System.out.println("This is test 5, Basic Pass");
    }

}

МойtestNg TestTest.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="SuiteB1" parallel="false">
  <test name="TestTest">

    <groups>
        <run>
          <include name="basic1"/> 
        </run>      
    </groups>

    <classes>
      <class name="myproj.TestTest"/>
    </classes>
  </test> <!-- Test -->
</suite> <!-- Suite -->

Моя структура каталогов:

src
  -myproj
    TestTest.java
  -resources
    -images
      hydrant.jpg

TestTest.xml
pom.xml

при запуске: mvn package -DskipTests = false тест запускается и может получить доступ к файлу изображения.

после сборки, когда я запускаю из командной строки (сборка по 'target' dir: java -jar C: \ Dev \ testproj \ target \ myproj-0.0.1.jar TestTest.xml

Я вхожу врезультаты теста FileSystemNotFoundException в строке, к которой осуществляется доступ к файлу.

1 Ответ

0 голосов
/ 20 июня 2019

В итоге я решил, что то, что Java «диктует» для соглашения, с каталогами, требующимися в определенных местах и ​​методах, которые работают в одном случае, а не в другом, было слишком запутанным для простого тестового приложения, которое я реализовывал.

Я нашел следующее, что мне нужно, простым способом:

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

Итак, помня об этом. Теперь у меня есть каталог «images» в корне моего проекта, и этот каталог будет развернут рядом с приложением, в результате чего будет получен следующий базовый продукт:

-myTestApp
   myTestApp.jar
   -images
      baseImage.jpg
      testImage.jpg

Код, который я использую для доступа к файлам из моего метода тестирования, выглядит следующим образом и работает для тестирования сборки и запуска в качестве приложения jar:

Path screenshotsPath = Paths.get(System.getProperty("user.dir"), "images");

Path baseFile = Paths.get(screenshotsPath.toString(), "baseImage.jpg" );
Path testFile = Paths.get(screenshotsPath.toString(), "testImage.jpg" );

double imageDiff =  calcImageDiff(baseFile, testFile);

Внутри calcImageDiff я просто использую следующее, где file1 и file2 - входные пути:

img1 = ImageIO.read(file1.toFile());
img2 = ImageIO.read(file2.toFile());

...