質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
JUnit

JUnitは、Javaで開発されたプログラムのユニットテストを行うためのアプリケーションフレームワークです。簡単にプログラムのユニットテストを自動化することができ、結果もわかりやすく表示されるため効率的に開発時間を短縮できます。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

1回答

4335閲覧

multiple versions of ant detected in path for junit

gomo

総合スコア27

JUnit

JUnitは、Javaで開発されたプログラムのユニットテストを行うためのアプリケーションフレームワークです。簡単にプログラムのユニットテストを自動化することができ、結果もわかりやすく表示されるため効率的に開発時間を短縮できます。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

2クリップ

投稿2014/10/30 05:29

Ant+JUnit+SeleniumでWEBアプリケーションのテストを書いてます。

アサーションがコケた時や例外時に出力にテスト中のURLを出力したいと思い、PlainJUnitResultFormatterを上書きました。

フォーマッター自体は期待通り動いているのですが、multiple versions of ant detected in path for junitというウォーニングが出ます。

下記のようなコマンドでテストを起動しています。

ant -f /Users/masamoto/Documents/repos/home/source/sites/selenium/build.xml -Dselenium.port=4444 -Dselenium.host=127.0.0.1 -Dinclude.path=/Users/masamoto/Documents/repos/home/source/sites/selenium/libs -Dsetting.path=/path/to/settings.yml -Dtest.class=jp.example.SomeTest -Dtest.methods=main

出力されるウォーニングは下記です。

test: [junit] WARNING: multiple versions of ant detected in path for junit [junit] jar:file:/usr/local/Cellar/ant/1.9.4/libexec/lib/ant.jar!/org/apache/tools/ant/Project.class [junit] and jar:file:/Users/masamoto/Documents/repos/home/source/sites/selenium/libs/apache-ant/ant.jar!/org/apache/tools/ant/Project.class

ant経由で実行するとant.jarが自動で含まれるのかと思って、build.xmlに記述してある${include.path}からant.jarを取り除くと今度はコンパイルがコケます。

compile: [javac] Compiling 18 source files to /Users/masamoto/Documents/repos/home/source/sites/selenium/build [javac] /Users/masamoto/Documents/repos/home/source/sites/selenium/src/jp/sunrisedigital/selenium/JunitFormatter.java:14: error: cannot access BuildException [javac] public class JunitFormatter extends PlainJUnitResultFormatter { [javac] ^ [javac] class file for org.apache.tools.ant.BuildException not found [javac] 1 error

当然コマンドのjarをpathelementに指定してやると問題なく動きますが、他の環境に配布した時に微妙なので引数で渡すようにしました。

<pathelement location="${ant.jar.path}" />
ant -f /Users/masamoto/Documents/repos/home/source/sites/selenium/build.xml -Dselenium.port=4444 -Dselenium.host=127.0.0.1 -Dinclude.path=/Users/masamoto/Documents/repos/home/source/sites/selenium/libs -Dsetting.path=/path/to/settings.yml -Dtest.class=jp.example.SomeTest -Dtest.methods=main -Dant.jar.path=/usr/local/Cellar/ant/1.9.4/libexec/lib/ant.jar

これでウォーニングも消え、ちゃんと動くのですが、よくあるシチュエーションだと思うのでなんかもっとスマートな解決策があるような気がしたので質問させていただきました。よろしくお願いします。

build.xmlの内容をアップしておきます。

<?xml version="1.0" encoding="UTF-8" ?> <project name="sunrise.selenium" default="clean" basedir="."> <description> Seleniumのテスト郡 </description> <property name="path.build" location="build"/> <path id="test.classpath"> <pathelement location="${path.build}" /> <dirset dir="${include.path}/jetty/resources"/> <fileset dir="${include.path}"> <include name="**/*.jar"/> </fileset> <fileset dir="${include.path}/velocity"> <include name="*.jar"/> </fileset> <fileset dir="${include.path}/apache-ant"> <include name="*.jar"/> </fileset> </path> <target name="init"> <!-- Create the time stamp --> <tstamp/> <mkdir dir="${path.build}"/> </target> <target name="compile" depends="init" description="compile the source" > <javac srcdir="src" destdir="${path.build}" includeAntRuntime="no" encoding="utf-8" debug="true" debuglevel="lines,vars,source"> <classpath refid="test.classpath" /> </javac> </target> <target name="test" depends="compile" description="test the source"> <junit fork="yes" haltonfailure="yes"> <jvmarg value="-Dselenium.host=${selenium.host}"/> <jvmarg value="-Dselenium.port=${selenium.port}"/> <jvmarg value="-Dsetting.path=${setting.path}"/> <test name="${test.class}" unless="test.methods" /> <test name="${test.class}" methods="${test.methods}" if="test.methods" /> <formatter classname="jp.expample.selenium.JunitFormatter" usefile="false" /> <classpath refid="test.classpath" /> </junit> </target> <target name="clean" depends="test" description="clean up" > <delete dir="${path.build}"/> </target> </project>

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

Selenium込みでは確認していませんがご容赦ください。

Antのライブラリーは通常コンパイルには使用しないので、コンパイル時のclasspathには含まれません。よって、個別に指定する必要があります。
また、実行時のclasspathにはランタイムとしてのAntライブラリーが設定されるので、かぶってしまいます。

というわけで、Antのライブラリー参照は、compileターゲットだけで使用できるように、testターゲットで使用するclasspathrefとは別に定義しておくのが良いのではないかと思います。

■■■■■■■■■■■■■■■■■■■■
追記(2014-12-12): すみません、改めて確認したところ、
単にinclude.pathからantを除去してjavacタスクのincludeAntRuntime="yes"を設定すれば、下記と同じことになるようです。
これで上手く行けば、こちらの方が適切な方法かと思います。
(最初に確認したときはこれでは上手く行かなかったのですが...)

参考にされた方には、大変申し訳ありません。
■■■■■■■■■■■■■■■■■■■■

lang

1<!-- 略 --> 2 <path id="test.classpath2"> 3 <fileset dir="${include.path}/apache-ant"> 4 <include name="*.jar" /> 5 </fileset> 6 </path> 7<!-- 略 --> 8 <javac srcdir="src" destdir="dst" includeAntRuntime="no" 9 encoding="utf-8" debug="true" debuglevel="lines,vars,source"> 10 <classpath refid="test.classpath" /> 11 <classpath refid="test.classpath2" /> 12 </javac> 13<!-- 略 -->

投稿2014/11/13 14:12

argius

総合スコア9388

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gomo

2014/12/09 09:05

回答ありがとうございます! 今ちょっと別案件に追われてるので、近々確認してみます。
argius

2014/12/12 14:20

改めて確認してみたら、ちょっと勘違いしていたようで、最初の回答よりも追記の方が適切かもしれません。 上手くいきましたら、ご報告いただければ幸いです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問