MavenやNetBeansでJunit実行時に日本語メソッドが文字化けするのを対策する。

NetBeansでテスト流したらもじばけしてた。
よくみたらMaven等でテスト実施時にアスキー変換されてしまっている。
こんなかんじ

-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running jp.co.gara.\u304C\u3089\u304C\u3089\u30C6\u30B9\u30C8

f:id:GARAPON:20160622140926p:plain

これは残念すぎる。
わかりやすさとして日本語のJunitテストケース好きなんですよね。
文字化けなおしたいなーとおもっていたらプラグインでなおった。
POMのビルドのところに>maven-surefire-pluginとmaven-surefire-report-pluginを追加。

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.18.1</version>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-report-plugin</artifactId>
                <version>2.18.1</version>
            </plugin>
        </plugins>
    </build>

これで再実行してみるとできました。

-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running jp.co.gara.がらがらテスト
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.001 sec - in jp.co.gara.がらがらテスト

f:id:GARAPON:20160622140917p:plain

Goodですね。
ただ、注意点があって上記プラグイン最新版は2.19.1なのですが、最新版を指定するともじばけします。なので2.18.1を指定するようにしましょう。
Maven Surefire Report Plugin – Usage

Selenium WebdriverのFireFox,Chrome,IEの初期設定およびProxy設定

想定環境はこんな感じ

FireFox

FireFoxはDriverの個別DLは不要。

    FirefoxProfile profile = new FirefoxProfile();
    profile.setPreference("network.proxy.type", 1);
    profile.setPreference("network.proxy.http", "127.0.0.1");
    profile.setPreference("network.proxy.http_port", 28080);
    WebDriver driver = new FirefoxDriver(profile);
    driver.get("http://localhost/garaponapp/");

こんな感じ。認証ありのProxyの場合にうまくIDパスワードを伝えることは出来ないので、
ローカルに認証をブリッジするProxyでもたてましょう。

chrome

https://code.google.com/p/chromedriver/downloads/list
からchromedriver.exeをDL。DLしたものはPJTOP/driver/に保存。

        System.setProperty("webdriver.chrome.driver", "./driver/chromedriver.exe");
        ChromeOptions option = new ChromeOptions();
        option.addArguments("--proxy-server=http://127.0.0.1:28080");
        option.addArguments("--proxy-bypass-list=localhost");
        WebDriver driver = new ChromeDriver(option);
        driver.get("http://localhost/garaponapp/");

Chromeの動作はFireFoxにくらべるとちょっともっさり。
Proxy設定したときにデフォルトではlocalhostとかに対してもProxyが効いてしまうのでBypass設定も入れてあげる必要あり。

Internet Explorer

http://docs.seleniumhq.org/download/
からDL。64bit版なら
これ

        System.setProperty(InternetExplorerDriverService.IE_DRIVER_EXE_PROPERTY, "./driver/IEDriverServer.exe");
        DesiredCapabilities capabilities = new DesiredCapabilities();
        Proxy proxy = new Proxy();
        proxy.setHttpProxy("127.0.0.1:28080");
        capabilities.setCapability(CapabilityType.PROXY, proxy);
        WebDriver driver = new InternetExplorerDriver(capabilities);
        driver.get("http://localhost/garaponapp/");

IEはめちゃめちゃもっさり。ほんとに耐えられないレベルで遅い。スローモーションかと見間違えるレベル。
そのため

driver.manage().timeouts().implicitlyWait(60, TimeUnit.SECONDS);

の値をかなりでかくしておくのがよい。

また
Caused by: org.openqa.selenium.WebDriverException: Unexpected error launching InternetExplorer. Protected Mode must be set to the same value (enabled or disabled) for allzones. (WARNING: The server did not provide any stacktrace information)
だのなんだのエラーで起こられる場合、インターネットオプションのセキュリティゾーンの保護モードを統一する。 すべてオンまたはすべてオフであればよい。すべてオンにしたほうが良いです。当然ですが。

Ubunts15.10にappiumをインストール

UbuntsにappiumをInstallしようとしたら色々めんどくさかったのでメモ

node最新版のインストール。

まずなにがめんどくさいって最新のnodeをインストールする作業がめんどくさいwww

普通に nodejs, npm をインストール

$ sudo apt-get install -y nodejs npm

こうすると激しく古いバージョンが入ります。これかなり罠ですよね。なんでなおらんのやろうか。

そこでn package をインストール

$ sudo npm -g config set proxy http://proxy:8080
$ sudo npm -g config set https-proxy http://proxy:8080
$ sudo npm cache clean
$ sudo npm install n -g

n package を使って 最新版のnode をインストールします。
Proxy環境下だとnコマンドが失敗するのでその場合suして環境変数にProxyを設定してから実行する。
さらに後でappiumをインストールする際もsudoで実行するとChormeDriverのDL時にProxyが効かないのでrootで作業してしまうのがいいかもしれません

$ sudo su
# export  http_proxy=http://proxy:8080
# export https_proxy=http://proxy:8080
# n stable
# ln -sf /usr/local/bin/node /usr/bin/node
#node -v
v6.2.1
# npm -v
3.9.3

これでやっと最新版になりました。
古いのはけしときましょう

sudo apt-get purge -y nodejs npm

Javaインストール。

Javaもないとだめなのでインストール。

$ sudo add-apt-repository ppa:webupd8team/java
$ sudo apt-get update
$ sudo apt-get install oracle-jdk7-installer
$ sudo apt-get install oracle-java8-installer
$ java -version
java version "1.8.0_91"

Javaは待ち時間がけっこうありますが順調。

nmpのProxyをさしてからappiumをInstall
(途中のChromeDriverのDLのところでProxyがとおらなくてfn must be a functionとかエラーが色々でるのでrootで作業していますが、よいこはちゃんとProxy設定をとおすなりするのが良いと思います。)

$ sudo su
# npm -g config set proxy http://proxy:8080
# npm -g config set https-proxy http://proxy:8080
# npm install -g appium
# appium -v
1.5.3

インストールできたー!

ついでにAppium Client(WebDriver)もインストールしましょう。

# npm install wd

これでOK!

SeleniumのDriver起動時に認証つきProxyの認証画面が出てきて困る。

これまたバッドノウハウです。もう世界からProxyなんてなくなれば良いのに(嘘

Seleniumでテストを作るときにDriverがブラウザを立ち上げますが、
認証つきProxyサーバを使っている場合認証ポップアップが出てしまってテストがとまって不便。
なので対処します。

Driverに認証情報を設定する

Proxy情報設定時にIDパスワードも一緒に設定します
こんな感じで書く。
userid:password@proxyhost:18080

	FirefoxProfile profile = new FirefoxProfile();
    profile.setPreference("network.proxy.type", 1);
    profile.setPreference("network.proxy.http", "userid:password@proxyhost");
    profile.setPreference("network.proxy.http_port", 18080);
    WebDriver driver = new FirefoxDriver(profile);

このid:PASS@アクセス先というのはSeleniumBasic認証つきのサイトにアクセスする際も使えます

ちなみにIDパスワードの設定はJava系でもものによって異なる(たとえばHTTPClientのバージョンでも異なる)ので
よく使う方は認証不要のProxyをLocalhostにたてて、そいつが認証を取るようにすると楽。

JAXRSで@QueryParam()でObjectを受けたい

JAXRSでPostだとこんな感じでパラメータをObjectで受けれるじゃないですか、

    @POST
    @Consumes(MediaType.APPLICATION_JSON)
    public Response login(LoginForm form) {

これをGetでもやりたいとおもったら結構困ったのでメモ
普通のGetはこんな感じ。そもそもGetなのでデータはクエリパラメータで受けるしかないです。

    @Get
    public Response get() {

クエリパラメータを受けるには@QueryParamとかで受けるんですが以下のようにしただけじゃパラメータ解析してくれない。

    @Get
    public String get(@QueryParam("auth") Auth auth) {

とはいえStringでうけとった値を各Getの中で解析するのはめんどくさいなとおもっていたら
受け取るVOのなかにvalueOfもしくはfromStringという名のstaticファクトリメソッドをがあれば良いということがわかった。
なのでAuthをこんな感じにしてあげればOK!

public class Auth {
    private String code;
    private String state;

    public String getCode() {
        return code;
    }
    public void setCode(String code) {
        this.code = code;
    }
    public String getState() {
        return state;
    }
    public void setState(String state) {
        this.state = state;
    }
    public static Auth valueOf(String value) {
        return data = JSON.decode(value, Auth.class);
    }
}

色々便利なのね-

参考
JAX-RSでパラメータの受け取り方をいろいろ試す — 裏紙

modrewriteしたURLが文字化けしないようにする。

modrewriteでURLを書き換えた際に書き換え後のURLに「#」とかが含まれる場合エスケープされてしまう。
リライト時に「NE」つけてエスケープしないようにしてもChrome側でえすけーぷされてします。。
FireFoxだと大丈夫なのにー。

とおもっていたら、「#」を「\」でスケープしてリライトすればいけた!

RewriteRule /app/callback /app/\#/callback/ [NE,R=301,L]

Proxy環境下からOAuth認証でGoogleAPIに接続する。

基本的なやり方はここ
Java Quickstart  |  Google Calendar API  |  Google Developers

手順に従って、サービスを作ってCalendarQuickstartをコピペしてコンパイルすればOK。

んで、こいつをProxy環境下で動かすには以下のあたりを、

        try {
            HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
            DATA_STORE_FACTORY = new FileDataStoreFactory(DATA_STORE_DIR);
        } catch (Throwable t) {

こんな感じで書き換えてあげればOK。

        try {
            HTTP_TRANSPORT = new NetHttpTransport.Builder()
                    .setProxy(new Proxy(Proxy.Type.HTTP, new InetSocketAddress("127.0.0.1", 28080))).build();
            DATA_STORE_FACTORY = new FileDataStoreFactory(DATA_STORE_DIR);
        } catch (Throwable t) {

余談だが、上記チュートリアル、関連APIが足りていないのでMavenであればdependenciesは

        <dependency>
            <groupId>com.google.oauth-client</groupId>
            <artifactId>google-oauth-client</artifactId>
            <version>1.22.0</version>
        </dependency>
        <dependency>
            <groupId>com.google.oauth-client</groupId>
            <artifactId>google-oauth-client-java6</artifactId>
            <version>1.22.0</version>
        </dependency>        
        <dependency>
            <groupId>com.google.oauth-client</groupId>
            <artifactId>google-oauth-client-jetty</artifactId>
            <version>1.22.0</version>
        </dependency>        
        <dependency>
            <groupId>com.google.api-client</groupId>
            <artifactId>google-api-client-gson</artifactId>
            <version>1.22.0</version>
        </dependency>
        <dependency>
            <groupId>com.google.apis</groupId>
            <artifactId>google-api-services-calendar</artifactId>
            <version>v3-rev125-1.20.0</version>            
        </dependency>

が必要。