SUMMER_WARSの日記

趣味や、仕事のこと、日々のことを徒然なるままに書き残すブログ

EclEmma Java コード・カバレッジのレポートを出力する

JUnit単体テストを自動化するのはいいんだけど、書いたソースって書いた分だけ全部通っているよな....という不安があると思う。
「通ってない=動いていない」なので、そのまま運用されるのは不安でしかないよね!そうだねプ○テインだね!

ということで、Eclipseプラグインをインストールして不安を解消するのじゃ。


[目次]

1)EclEmmaのインストー

 以下の記事が分かり易いので、記事通りにインストールします。

javaworld.helpfulness.jp

2)テストを実行後、ガバレッジビューからレポートを出力する。

ここから右クリックでレポート出力ができるらしいんだけど、できない!

f:id:SUMMER_WARS:20170627130217p:plain


・プ○テインが足りないようなので、しかたない。
 対象のプロジェクトを右クリック→セッションのエクスポート

f:id:SUMMER_WARS:20170627130457p:plain


・ガバレッジレポートを選択→次へ
f:id:SUMMER_WARS:20170627130544p:plain


・書式、ファイルの出力先を選択して完了でOK!!!
f:id:SUMMER_WARS:20170627130655p:plain

環境

 Eclipse:Neon.3 Release (4.6.3)

MySQLで対象のデータベースをバックアップ!そしてリストアの行く末密かに暗示する人Honey!!

MySQLのdump(ダンプ)が出来ないぃぃ!

厳密にいうと、バックアップはできてるけどリストアが出来ない状態!!!!
(俺のいく末密かに暗示する人Honey!!状態)←DxxUMP


先に答えを言うと単なるコマンド間違いでした。。。。泣

手順をメモ。

1)mysqldumpコマンドを使って対象のデータベースのバックアップを取得する。

 sampledbが対象のデータベース名、.sqlファイルがバックアップしたファイルになります。適当な名前を付ける。

C:\>mysqldump -u root -p sampledb > C:\\sampledb.sql
  • u:ユーザー名を指定するオプション(rootを指定している)
  • p:パスワードを指定するオプション(セキュリティ的に明示的な指定をしない。コマンド実行後にパスワードを聞かれるのでそこで入力する)


mysqlのbinのパスを通していない場合は通しておかないとMySQLのbinディレクトリ上でコマンドを打つはめになるので以下のコマンドを叩いておく。(料理で言うと下準備)

C:\>set PATH=%PATH%;C:\Program Files\MySQL\MySQL Server 5.7\bin

「~%PATH%;hogehogeにはMySQLをインストールしたディレクトリ(mysqldump.exeが格納されているディレクトリ)を指定する。

ちなみに↑のコマンドの場合は一時的なもので、コマンドプロンプトを閉じると次回も同じように下準備が必要になる。。。


特別な理由がない場合(男子ごはんに下準備は要らねぇ!という男気溢れる方以外)は素直にこっちを叩きましょう。

C:\>setx /M PATH "%PATH%;C:\Program Files\MySQL\MySQL Server 5.7\bin"

↑で「エラー: レジストリ パスへのアクセスが拒否されました。」が出た人!!(安心してください。私も出ました笑)

コマンドプロンプト管理者権限で起動するとさっきのコマンドでエラーでなくなります。

2)取得したバックアップをリストアする(バックアップしたデータに戻す※バックアップした時の状態に戻す)

以下のコマンドを叩いて、1)と同じくパスワードを聞かれるので入力してあげる。

C:\>mysql -u root -p sampledb < C:\\sampledb.sql

※この「mysql」をずーーーーーーと「mysqldump」って打っていた。。。。アホや。。。

本当にリストアできたか気になる人は2)をやる前に、データベースを削除してからリストアするとOK。
(元に戻せなくなってしまった!とか削除に関しては責任持ちませんのであしからず。しっかりとバックアップが出来ていて、リストアも出来るのを確かめてから、攻めに行きましょう。)

ただし、このバックアップの取り方は、「create database sample」でデータベースの器を作成しておく必要があるので注意。

※データベースの名前バックアップしたものと同じにする必要がある。

3)環境

 Windows7
 MySQL 5.7.17

Selenium WebDriver(ChromeDriver) で「org.openqa.selenium.remote.UnreachableBrowserException」が発生する

単純にダウンロードしたChromeDriverが古かった。。。

以下のサイトから最新のバージョンを取得して使用したら無事に解決。(chromedriver_win32.zipを解凍して.exeを配置する)
(※ちなみに2.9のディレクトリがあってそれを使用していた。。。日付見ると2014年だった。。。2.9が最新と思ってしまった。。。64bitOSでも32bitを使うというかそれしかない)


sites.google.com

動的Webプロジェクトでサーバー実行すると「サーバー ローカル・ホスト の Tomcat v8.0 サーバー は始動に失敗しました。」が発生する

Servletを作っていて結構発生する人が多い。このエラーが来たらこれやろ!っていうやつ。まずはここ確認しよう。


目次

1)現象

 Servletを実行するとエラーが発生してしまう。↓こんな感じ。※詳細を見ると、「サーバー ローカル・ホスト の Tomcat v8.0 サーバー は始動に失敗しました。」ってでます。

f:id:SUMMER_WARS:20170621091126p:plain

2)環境

 Java8(動的Webプロジェクトを作成)

 Apach Tomcat 8.0.44

 MySQL 5.7.17

3)原因

 サーブレットアノテーションを使って、リクエストのURLでどのサーブレットが動くかを設定できる(※web.xml設定ファイルが不要)んやけど、そのアノテーションの文字列が被っちゃってるよ!Hey!you!っていう話。

package jp.sample;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


/**
 * Servlet implementation class LoginServlet
 */
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;


この @WebServlet("/login") を他のサーブレットでも設定してたりすると発生する。
※1つサーブレット作って、他のサーブレットもこれをコピペして作ってたりすると発生する可能性大だよ~

4)対策

 アノテーションの文字列が被っているかサーブレットを確認し、別の名前に修正する。基本的にServletのクラス名から取ろう。

【追記】

2017/06/28 そもそもコンパイルが通っていない場合も同様のエラーが発生。

Servlet使っているんだがセッションからgetAttributeした値がnullになってしまうのなんでなん

目次


1)現象

 ローカル環境でsession.setAttribute("hoge", "hogehoge")で値を設定後、別サーブレットにforwardし、forward先のサーブレットでgetAttribute("hoge")するとキーがなくてnullになってしまう。(setもgetもしっかりしてるしなんで???)
 
 ※サーブレットではなくJSPにforwardし、getAttribute("hoge")すると正常に取得できるという謎現象に遭遇。これはどぎゃんかせんといかんばい。ということで備忘録。こういうのってだいたい環境の問題なんだよね。。。

2)環境

 Java8(動的Webプロジェクトを作成)

 Apach Tomcat 8.0.44

 MySQL 5.7.17

3)原因

 どうやら、Tomcatサーバーに複数のリソースを追加していたためらしい。。。
 ※スクショ自体はリソース追加していないけど、この現象が発生する条件は、リソースを2つ以上追加しているとき。

f:id:SUMMER_WARS:20170620142121p:plain

4)対策

 サーバー1つにつき1個のリソースにすることで解決。

Tomcat8 + Servlet + MySQLのコネクションプールを作る

目次

1)やりたいこと

DBのコネクションを取得するためには以下の処理で実装するんだけど、

Connection conn = null;
String url = "jdbc:mysql://localhost:3306/sample";
String user = "root";
String password = "";

try(conn = DriverManager.getConnection(url, user, password);){

  // データベースに対する処理

}catch (SQLException e){
 // エラー処理
}

↑開発する上で各メンバー毎にクローズのし忘れとか発生してしまうし、
コネクションプール作るのがベターなのでコネクションプールで実装してみた。

2)環境

 Java8(動的Webプロジェクトを作成)

 Apach Tomcat 8.0.44

 MySQL 5.7.17

環境確認方法

Tomcatのバージョンはサーバーを起動後、

http://localhost:8080/

 にアクセスすれば確認可能。※ポートは要確認


MySQLのバージョンはMySQLクライアントに接続し、

select version();

 をたたけばOK


3)やりたいことはやってみる

まずは、コネクションプールを取得するクラスを作成しーの

package jp.sample.DAO;

import java.sql.Connection;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;

public class DataSourceManager {
	private final String JNDI = "java:comp/env/jdbc/mysql";
	protected Connection connection;

	/**
	 * データベースコネクション取得
	 */
	public DataSourceManager() {
		try {
			Context context = new InitialContext();
			DataSource dataSource = (DataSource) context.lookup(JNDI);
			connection = dataSource.getConnection();
			connection.setAutoCommit(false);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

各DAOクラスで継承する

package jp.sample.DAO;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

public class UserDAO extends DataSourceManager {

	// 主キー検索
	private final String SELECT_BY_ID = "SELECT * FROM USER WHERE USER_ID = ?";

	/**
	 * 主キー検索
	 * @param id
	 * @return UserVo ユーザー情報を返却、データが存在しない場合 null
	 */
	public UserVo selectById(String id) {
		UserVo result = null;
		try (PreparedStatement ps = connection.prepareStatement(SELECT_BY_ID)) {
			ps.setString(1, id);
			ResultSet rSet = ps.executeQuery();
			result = resultSetAttribute(rSet);  // 取得した値をセットするメソッドを別で作成しているのでそれを呼ぶ

		} catch (SQLException e) {
			e.printStackTrace();
		}
		return result;
	}
        
        // 以下割愛

これで終わり!ってなればいいんやけど、そうもいかない。
Tomcatのバージョンで設定方法が異なっていてserver.xmlに書けやとかうんたらで、むしろこちらの方がめんどくさかった。

/[プロジェクト名]/WebContent/META-INF/context.xml

↑結果、context.xmlに設定情報を書き込むでOK。
(パスワードとかurlとかは各DBに合わせて修正)

こんな感じ。

f:id:SUMMER_WARS:20170620125304p:plain


※注意
コネクションプールを取得するクラスで定義している"JNDI"の「java:comp/env/xxxx」とcontext.xmlの「name="xxxx"」が一致すること。

private final String JNDI = "java:comp/env/jdbc/mysql";
name="jdbc/mysql"


これで接続できるはず!!!

VisualStudioでusing文を自動的に追加してくれるショートカット

VisualStudio(2013)でusing文を自動的に追加してくれるショートカットがあるの知らなかった...

勝手に追加してくれればいいのに.... 

 

[shift] + [alt] + [F10]