アル中プログラマの備忘録

酔いどれまさになう

新しく分割しました

スポンサーサイト

このエントリーをはてなブックマークに追加
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
  1. --/--/--(--) --:--:--|
  2. スポンサー広告

[Android]Handlerを使ってGUI操作

このエントリーをはてなブックマークに追加
概要
・Androidで別スレッドからGUIを操作すると落ちちゃうのでHandlerを使ってメインスレッドで実行しよう
・よくあるサンプルと少し変えてみる


よくある例
//Handlerのインスタンスを【メインスレッド上で生成する】
//※インスタンス化するスレッドが大切
final Handler handler=new Handler();

//別スレッド上でGUIを触りたいときはHandlerのpostメソッドを使う
new Thread(new Runnable() {
    public void run() {
        handler.post(new Runnable() {
            public void run() {
                //ここの内容はHandlerが生成されたスレッドで実行される
              findViewById(xxx).xxx
            }
        });
    }
}).start();
コメントに書いた通り、postされた処理はHandlerが生成されたスレッドで実行される。
つまり結果的にメインスレッドで実行されているだけで、
メインスレッドで処理する機能としてHandlerがあるわけではない。


ちょっと変えてみる
postした処理がHandlerが生成されたメソッドで実行されるのは、
Handlerのデフォルトコンストラクタが実行中のスレッドにひもづいたLooperインスタンスを使うからだ。

なので、「メインスレッドで処理する」に合うように、
「メインスレッドのLooper」をセットしてやる。

//postメソッドを使うのは変わらない
new Thread(new Runnable() {
    public void run() {
        //直接Looperを指定するので、あらかじめHandlerを作っておく必要はない
        //メインスレッドのLooperはLooper.getMainLooper()で取得できる
        new Handler(Looper.getMainLooper()).post(new Runnable() {
            public void run() {
                //ここの内容はメインスレッドで実行される
              findViewById(xxx).xxx
            }
        });
    }
}).start();
良し悪しは設計次第だが、これでどこからでもメインスレッドを呼べる。
(Handlerを受け渡しする必要がなくなる)


   
スポンサーサイト

テーマ:android - ジャンル:コンピュータ

  1. 2015/04/18(土) 19:53:06|
  2. Java
  3. | トラックバック:0
  4. | コメント:0

[Android]端末の時間がズレ過ぎているとGooglePlayにつながない

このエントリーをはてなブックマークに追加
アプリの試験をしていると、
データの表示条件の確認のために端末の時間を変えたりする。


さらに地図なんかを使っていると、
「Google Play開発者サービス」をアンインストール&インストール
してみたりいろいろする。


そうしてると突然、
Google Playにつながらなくなってしまった・・・


試してみるとGoogle MapやYouTubeもダメ。
でもブラウザーは使えるのでネットワークは生きている。


しばらく悩んでいたが、原因は大したことなく、
端末の時刻がおかしいとつながないようになっているらしい。
時刻を戻したら問題なくつながった。


検証用の端末を使っていると、
他にも開発者向けの機能でActivityを逐一破棄する設定がONになってたり、
思わぬ罠に・・・
(この場合はメモリ不足になった時の動作確認とかに影響が)


要は使ったらちゃんと戻そうってことなんだけど、難しいよね。
社外の検証センターとかだと初期化までしちゃうんだろうけど、
そこまでやると使い勝手悪いし。



   
  1. 2015/03/02(月) 12:00:00|
  2. Java
  3. | トラックバック:0
  4. | コメント:0

Seleniumでcookieclicker

このエントリーをはてなブックマークに追加
一部で話題になってるcookieclickerをSeleniumでクリックさせてみた。

Seleniumの準備はここで書いた。
今回のプロジェクト構成も全く同じで↓のようにした。
Screenshot_from_2013-09-23 16:49:24

で↓がテストコード。
とりあえず毎秒10クリックで10秒間試行して、どんだけクッキーできたか確かめる。
package くっきぃくりっかぁ;

import java.io.File;
import java.util.Timer;
import java.util.TimerTask;

import org.junit.After;
import org.junit.AfterClass;

import static org.junit.Assert.*;

import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriverService;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.RemoteWebDriver;

public class クリックしまくるぜ {
	
	/** chromedriverのパス	 */
	private static final String chromedriverPath = "lib/chromedriver";
	/** サービス */
	private static ChromeDriverService service;
	/** ドライバ */
	private WebDriver driver ;
	
	/** テスト対象のページ */
	private final String testTargetUrl = "http://orteil.dashnet.org/cookieclicker/";
	
	/** さすがにスリープ無しはしんどいので */
	private static final int clickPerSec = 10;//回/s
	private int sleep = 1000;//ms
	
	/** 試行時間 */
	private final int testTime = 10 * 1000;//ms
	
	/**
	 * 初期化処理でサービスを起動する
	 * @throws Exception
	 */
	@BeforeClass
	public static void beforeClass() throws Exception {
		service = new ChromeDriverService.Builder()
		.usingDriverExecutable(new File(chromedriverPath))
		.usingAnyFreePort()
		.build();
		service.start();
	}
	/**
	 * 最後にサービスを停止する
	 */
	@AfterClass
	public static void afterClass() {
		service.stop();
	}
	
	/**
	 * 各テストごとにドライバを初期化する
	 */
	@Before
	public void before() {
		driver = new RemoteWebDriver(service.getUrl(),
				DesiredCapabilities.chrome());
		
		//スリープ時間
		sleep = 1000 / clickPerSec;
	}
	
	/**
	 * 各テストごとに破棄する
	 */
	@After
	public void after() {
		driver.quit();
	}

	/**
	 * クリック(本来の使いかと全然違うけどw)
	 * @throws InterruptedException 
	 */
	@Test
	public void ちょークリックするぜ() {
		//ページに移動して
		driver.get(testTargetUrl);
		
		//ひとまずステータスを表示
		WebElement status = driver.findElement(By.id("statsButton"));
		status.click();
		
		//クッキを見つける
		WebElement cookie = driver.findElement(By.id("bigCookie"));
		
		//メインスレッド
		final Thread mainThread = Thread.currentThread();
		
		//停止用のタイマー開始
		Timer timer = new Timer();
		timer.schedule(new TimerTask() {
			@Override
			public void run() {
				// メインスレッドに割り込む
				System.out.println("割り込むぜ");
				mainThread.interrupt();
			}
		}, testTime);
		
		//ひたすらクリック
		while (true) {
			cookie.click();
			try {
				Thread.sleep(sleep);
			} catch (InterruptedException e) {
				System.out.println("停止");
				//割り込まれたら停止		
				break;
			}
		}
		
		//期待通りクリックされてるか確認
		WebElement cookies = driver.findElement(By.id("cookies"));
		int cookieCount = Integer.parseInt(cookies.getText().split(" ")[0]);
		int expected = clickPerSec * testTime / 1000;
		assertTrue("作りたかったクッキー:" + expected + "個, でもできたのは" + cookieCount + "個",
				cookieCount >= expected);
	}
}


タイマーを使っての10秒試行ってのはちょっと無茶があるかな。
クリックの無限ループをスレッド作ってやらないのはGUI触るときに落ちるのが嫌だから。


Thread.currentThread()で取得したスレッドに対して割り込み(interrupt)を実行すると、
InterruptedExceptionが発生し、無限ループ中のcatchに入り無限ループが停止する。

画面の表示からクッキーの数を表している部分を探し、数値だけ取り出す。
その数値と、秒間のクリック数と試行時間から求めた理想値を比較する。

実際に実行すると↓のようになった。
秒間10クリック、10秒試行(理想値100)に対して50個
秒間100クリック、10秒試行(理想値1000)に対して185個
秒間1000クリック、10秒試行(理想値10000)に対して215個
秒間1クリック、100秒試行(理想値100)に対して94個

まぁ、どんだけ早くクリックしたって、他の処理は早くならないので
こんなもんだよな。

その他
cookieclickerは開いたブラウザごとに記録を保持しているけど、
テストを実行し直すことにきちんと0からカウントが始まる。

テストツールなんで、この動きは当たり前なんだけど、
WEBのGUIを人力でテストしようと思うと
こういったCookie(偶然クッキーだな)やキャッシュを削除したりをつい忘れたりするから
きちんとしてるのはありがたい。

今はWEBの無い仕事なんで使う機会がないけど、機会があれば使いたい。
今のところはそもそもテストの自動化なんてものも無ければ、ビルドも手動だ(泣)
もう2年にやっていれば。。


以上。

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2013/09/23(月) 17:31:16|
  2. Java
  3. | トラックバック:0
  4. | コメント:0

WindowBuilderを使ってみた

このエントリーをはてなブックマークに追加
WindowBuilder
仕事で画面イメージを作る必要があったので触ってみた。


簡単な変更とかなら、画像編集ソフトで済ましてしまうのだけど、
仕様が決まり切らない段階のため、変更できる状態のほうが望ましいので
画面だけのモックアップとして作ることに。


とりあえず使えるようにするところまでメモしておく。

[インストール]
といっても、Pleiadesを使うとはじめから入ってるので何もしない。


[プロジェクトの作成]
ファイル→新規→その他→WindowBuilder→SWT Designer→SWT/JFace Java Project
を選択する。
20130913create.jpg

適当に名前とかを決める。
(実際にはコンパイラバージョンとか気にするべきだけど、今は気にしない)
20130913create2.jpg

これで空のプロジェクトができるので、ここに画面を追加する。
プロジェクト右クリック→新規→その他→WindowBuilder→SWT Designer→SWT→アプリケーション・ウィンドウ
を選択する。
20130913source.jpg

また名前を適当に決めて、今回は画面これしか作らないので、
「public static main() method」にチェックを入れておく。
20130913source2.jpg

すると勝手にコードができる。
20130913main.jpg

で、Designを開くとGUIで編集できる画面が開く。
20130913main2.jpg

実際にこのままで実行してみると↓のようなウインドウが開く。
20130913window.jpg


あとはGUIツールでボタンやら何やらを追加していくだけである。
実際にコードと対応しているので、モックアップの動きもつけることができる。



以上。



テーマ:プログラミング - ジャンル:コンピュータ

  1. 2013/09/13(金) 21:48:01|
  2. Java
  3. | トラックバック:0
  4. | コメント:0

Selenium WebDriverを使ってみた

このエントリーをはてなブックマークに追加
Selenium WebDriverを使ってみた。

[1.ダウンロード]
Selenium
http://docs.seleniumhq.org/
から以下を取ってくる。
・Selenium Server (formerly the Selenium RC Server)
・Selenium Client & WebDriver Language Bindings
※今回はJavaのを取ってきた。

chromedriver
https://code.google.com/p/chromedriver/downloads/list
Chromeで動かしたかったので、取ってきた。

[2.Javaプロジェクト作成]
Junitから実行できるように作ります。
とりあえず↓のような構成で作成。
プロジェクト構成
libフォルダを作って、とってきたものを全部入れています。
jarはビルドパスに追加(ソースはjarに対して添付)

[3.テストの作成]
Junit4形式で書くことにしました。(SampleTest.java)
説明はコメントにて。
package test.selenium;

import static org.junit.Assert.*;
import static org.hamcrest.core.Is.*;

import java.io.File;

import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriverService;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.RemoteWebDriver;

/**
 * Selenium使用のお試しコード
 * @author kurose
 *
 */
public class SampleTest {
	
	/**
	 * chromedriverのパス。以下から取得してくる。
	 * https://code.google.com/p/chromedriver/downloads/list
	 */
	private static final String chromedriverPath = "lib/chromedriver";
	/** サービス */
	private static ChromeDriverService service;
	/** ドライバ */
	private WebDriver driver ;
	
	/** テスト対象のページ */
	private final String testTargetUrl = "http://papappi.blog.fc2.com/";
	
	
	/**
	 * 初期化処理でサービスを起動する
	 * @throws Exception
	 */
	@BeforeClass
	public static void beforeClass() throws Exception {
		service = new ChromeDriverService.Builder()
		.usingDriverExecutable(new File(chromedriverPath))
		.usingAnyFreePort()
		.build();
		service.start();
	}

	/**
	 * 最後にサービスを停止する
	 */
	@AfterClass
	public static void afterClass() {
		service.stop();
	}
	
	/**
	 * 各テストごとにドライバを初期化する
	 */
	@Before
	public void before() {
		driver = new RemoteWebDriver(service.getUrl(),
				DesiredCapabilities.chrome());
	}
	
	/**
	 * 各テストごとに破棄する
	 */
	@After
	public void after() {
		driver.quit();
	}
	
	/**
	 * テストケースの例。
	 * ページのタイトルが正しいかを確認してみる。
	 */
	@Test
	public void テストページのタイトルを確認する() {
		driver.get(testTargetUrl);
		assertThat(driver.getTitle(), is("アル中プログラマの備忘録"));
	}

}

これを実行すると、Chrome(インストールしてないとダメ)が立ち上がり、
このブログのトップページが開かれて、Chromeが終了します。

assertThat(driver.getTitle(), is("アル中プログラマの備忘録"));
は正しいので、テストに成功して結果がグリーンになります。

ここを別のタイトルに書き換えるとテストに失敗することが確認できます。

今日はここまでですが、画面上の要素をIDや名前などで取得できるようなので、
取得して値を確認したり、逆に入力できるようです。

あまり細かいことをやりだすと検査用のコードが増えそうですが、
頻繁に再確認する部分ならテストコードにする価値はあるかなと思います。


以上。 続きを読む

テーマ:システム開発 - ジャンル:コンピュータ

  1. 2013/08/30(金) 00:45:12|
  2. Java
  3. | トラックバック:0
  4. | コメント:0
次のページ

おすすめ

プロフィール

アル中プログラマ

Author:アル中プログラマ
ハイボ○ル?
いいえ
ジンジャーエールです。

検索

Translate

カテゴリ

未分類 (28)
セミナー・勉強会 (34)
読書 (12)
プログラム (8)
環境構築 (16)
C++ (3)
Java (7)
C# (1)
Tips (1)
食べ物 (14)
TED (3)
マイホーム (0)
プロマネ (1)

RSSリンクの表示

おすすめ

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。