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

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

ただいまの
回答率

90.48%

  • Java

    14122questions

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

  • selenium

    531questions

    Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

  • JUnit

    182questions

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

java プロジェクトディレクトリの構成について

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,463

poyopi

score 97

selenium, WebDriverを利用してWEBサイトへアクセス・画面操作・画面キャプチャ/画面ソース保存等を自動で行うようなコードをJavaで書いています。その際JUnitを利用しており、現状、プロジェクトディレクトリでsrc/main/javaを使用せず、src/test/javasrc/test/resources/ )のみで書いています。
 src/test/java配下のパッケージは大まかには

  • common
    ├ セットアップ用クラス(chromeDriverのセット、seleniumServerの立ち上げ・ストップ)
    └ ドライバのコンテキストクラス、汎用的なメソッド類(キャプチャ保存等)
  • senario
    └ 画面操作のパターンクラス
  • invoke
    └ 上記senarioを実行するクラス 

のように構成しています。

 動かすのに問題はないのですが、src/main/javaを使用しないプロジェクトはおかしいということはないでしょうか。もっとこういうやり方にしたほうがよい等のご助言を賜りたく、ご意見いただけませんでしょうか。


[追記] なぜJUnitを使っているか:
 senarioのいくつかを一度に(順繰りに)行う等するため、リスト(chromeとFireFoxのドライバ。IEのドライバはうまく動作しなかったため、除外しました)にしているコンテキストをforEachで実行させるようにしています。大まかに以下のようなコードです。

public class Invoker {
    static private List<Context> contexts = new ArrayList<>();

    @BeforeClass
    public static void setup() throws Exception {
        セットアップ用のクラスからセットアップのメソッド実行
        contextsにChromeとFireFoxのドライバをadd
    }    

    @AfterClass
    public static void quit() throws Exception {
        ドライバのquit
    }

    @Test
    public void case1() {
        contexts.forEach(it -> {
            new シナリオのクラス().シナリオのメソッド(it);
        });
        contexts.forEach(it -> {
            new シナリオのクラス().シナリオのメソッド(it);
        });
    }

    @Ignore("unexecuted")
    @Test
    public void case1() {
        contexts.forEach(it -> {
            new シナリオのクラス().シナリオのメソッド(it);
        });
        contexts.forEach(it -> {
            new シナリオのクラス().シナリオのメソッド(it);
        });
    }
}


 きれいではないと思うのですが、実行したくないテストケースについて@Ignoreで明示的に行わないようにしています。JUnitの本来の使い方としては、src/main/java内のモジュールを切り出してテストするような用途だとは思っているのですが、書いているうちに混乱してきてしまっていて、ご助言を賜りたい次第です。情報不足でしたら、ご指摘ください。


[再追記]
argiusさんよりご回答いただいて1ヶ月超過しているので、根治/再実装はしておりませんが該当プロジェクトの修正の方向性をまとめます。

  1. テスト内に書いているシナリオや起動クラスはメインに移動する。
  2. @Ignoreで無視している部分は、起動時のオプションなどで走らせるシナリオのメソッドを変える等で解決する

現在はjarに固めずIDEから直接テストを起動するやり方で運用しておりとても楽ですが、構成を見直し適したものにしたいと思います。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • argius

    2016/04/20 20:17

    もしよろしければ、JUnitを何のために使っているのか、すこしご説明頂けますか?

    キャンセル

回答 1

checkベストアンサー

+1

追記ありがとうございます。

src/main/javaのようなMavenスタイルのディレクトリー構成は、Maven,Gradle,sbtなどのビルドツールのためのものなので、その恩恵を受けられるようにするにはそれなりの構成にするのが望ましいです。

src/test/javaの下にあるコードは、テスト用のコードなので、今この

WEBサイトへアクセス・画面操作・画面キャプチャ/画面ソース保存等を自動で行う

という機能がプロダクトとして実装されたものであれば、これをパッケージングを行う機能を使ってパッケージを作ったり、それをデプロイすることができなくなります。
つまりJarファイルにしてそれを動かすというのは基本的にはできないものとなります。

JUnitライブラリーの依存関係をtest限定にしなければ、それを回避できますが、あまり一般的なやりかたではないですね。
あくまでJUnitはテストのためのライブラリーなので、それ以外の用途は想定していないからです。

任意のメソッドを実行したいのでしたら、JUnitでやっているようなことを自前でリフレクションなどを用いて実装するほうが良いでしょうね。

常にソース付きで使い、ビルドツールのtestコマンドで実行する前提なら、これでもかまわないとは思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/04/21 18:26 編集

    ご助言ありがとうございます。このプログラムは動作確認に利用する予定のものなのですが、この動作確認のためのseleniumのプログラムの動作確認(変な日本語ですね)は、IDEからJUnitのRun JUnit Testを行うことで実現しておりました。ですが、seleniumが自動化のためのものであることを鑑みると、現状のやり方はおかしいですね。少し構成を見直してみて、納得のいく実装ができたら、質問にその内容を追記して、解決済みにするように致します。

    キャンセル

関連した質問

同じタグがついた質問を見る

  • Java

    14122questions

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

  • selenium

    531questions

    Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

  • JUnit

    182questions

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