2018年8月1日水曜日

AIテストツールのMagic Podを使ってみた(かった)

こことか
https://tech.nikkeibp.co.jp/atcl/nxt/column/18/00359/071100004/

こことか
http://weekly.ascii.jp/elem/000/000/400/400673/

で話題になっていたAIテストツールMagic podというのが非常に興味深いので少し使ってみてレポートしたい。

まずこちらへGo
https://magic-pod.com

Githubのアカウントでログインできるので「無料版を使ってみる」から登録してみる。(Githubのアカウントなしでも普通にメールで登録可能。)

組織名とproject名とテスト名を聞かれるので適当に登録し、

Create。

・・・デフォルトで英語??つらいので日本語に設定変更(^^♪
・・・あれ?見当たらない。。。動画等では日本語のインターフェースになっているようなので、日本語インターフェースも用意されてるんだと思うが、メニュー全部見ても日本語への設定変更の項目が私には見つけられなかった@2018年7月現在。。。
しょうがないので今日は英語のまま行く。

今回はAndroid携帯を動かしてみようと思う。
まずはPC側の環境構築が必要。
「Magic Pod Desktop」なるパッケージが必要とのことでダウンロードしてみる。
https://www.trident-qa.com/magic-pod-help/

Android studioも必要
https://www.trident-qa.com/magic-pod-android-set-up/

この手順に従って、JavaとAndroid SDK一式(tools, platform-tools, build-tools, API)をインストール。

・・・と、恥かしながらここまでやってから気づいた「なお、Windows PCは未対応です。」との表記・・・( ;∀;)
うーん。最近MACのシェアが馬鹿にならないくらい上がってきているとは聞いていたが。。。うーん。

仕方がないので、実機を動かすのは諦めて、AIと呼ばれている部分、画面の画像からUIを抽出する部分を弄ってみたい。

まずは、Yahoo乗換案内。

この画像を読み込ませてみると・・・

こんな感じで読み込まれ、基本的にすべてのUIを識別出来ていた。すばらしい!

まぁこれは境界がくっきりしていてわかりやすいし、楽勝か。
もうちょっと難しそうなゲーム画像を用意してみる。

Age of CivilizationsというAndroidゲーム。

こちらも明確なボタン類は大体行けているようだが、地図の境界はやはりちょっと難しい様だった。
とはいえ人間と比べたらまだまだにせよ、かなり高確率でUIを認識してくれているように見える。

この後の作業としてはキーワード駆動テストの様な要領で、アクションを選択後、UIをドラッグ&ドロップし登録することで、簡単にテストスクリプトが書ける様になっている。
↓こんなイメージ。

・・・というわけで環境の都合で(MAC持ってない)動作確認まではできなかったが全体の所感としては、現時点では「UI認識に画像解析AIを用いたキーワード駆動テストフレームワーク」といえるものであると理解できた。
(ASCIIの記事なんかを見ると「AIで自動ソフトウェアテストを実現するウェブサービス「Magic Pod」」等というタイトルが記載されており、テスト対象分析~テスト設計~実行までAIがカバーするかの様な印象を惹起させるが、これは少なくとも現時点では実現されておらず、誤解の元になりかねない。)

とはいえ、ゆくゆくはゲーム攻略AIみたいな仕掛けと組み合わせてテスト実行とかまでAIが支援できるようになると、素晴らしいことになりそうだ。

2018年7月25日水曜日

Python2系と3系を両方共存させて使いたい(簡単)@Windows

AIや世の中のいろんなツールのスクリプティング用言語として、割と頻繁に使われているPython。
個人的にはインデントが重要な意味を持つ仕様がどうにも好きじゃない。
そのうえに2系と3系で微妙に許容される文法が違ったり、
2系:
 〇 print "Hello World!!"
 〇 print ("Hello World!!")
3系:
 × print "Hello World!!"
 〇 print ("Hello World!!")

inportやpip installするライブラリの名称や仕様がちょっとずつ違ったり、あるいはどっちかには無かったり、と結構情報集めるのにも怠い状態である。

・・・のだが、最近使わざるを得ない機会(しかも2系3系両方)が増えてきた。

Venvとか調べるの面倒だなーと思ってたら意外とすんなり共存ができたので、メモしておきたい。

まず、
こちらから2系3系それぞれの最新版インストーラをダウンロード。

※余談だが、Python 2.7.9より前のインストーラではpipが同梱されておらず、しかもググると出てくるpipの追加方法(get-pip.pyやらを使用)が現在では動かず、いろいろ嵌るので注意。最新版を落とせば問題ないが、社内のセキュリティ規則とかでPython 2.7.9より前のインストーラをイントラからダウンロードして使用しなければならない場合などは要注意。

現時点(2018年07月25日)での最新版は、
 Python 3.7.0
 Python 2.7.15
なのでまずはこいつらのインストーラをダウンロード。

したら、まずは2系のインストール
「python-2.7.15.amd64.msi」を起動。
基本的にNEXT→NEXTで問題ないはず。
もしインストールパスが長いパスになっていたら、「C:\Python27\」みたいなところに直しておいた方が、後々Path通すのとかコマンドラインでGit使うのとか、いろいろ楽なので私は修正する。

Pathは後でちょっと修正するが、どうせなので通しておく。


ほかには特に迷うことは無いはず。

次に「python-3.7.0-amd64.exe」を起動。
次へ次へと行きたいところだが、デフォルトだとやたら深いインストールパスになるので、Customize installationで行く。

Add Python 3.7 to PATHもチェック入れておく。
ここに書いてあること以外はそのままNextで行くが、長ったらしいインストールディレクトリは嫌なので、、、

短くしておく。

他はお好みで。

Install。
終わったら、環境変数のPathの設定を開き、2系3系それぞれのpython.exeとインストールディレクトリ配下の「scripts」フォルダを追加する。
※多分インストーラでチェックを入れていればそうなっているはず。

こんな順番で入っているはず↓

C:\Python37\Scripts\
C:\Python37\
C:\Python27\
C:\Python27\Scripts\

この順番を変更して、2系のパスが先に来るようにする。


そうしたらコマンドプロンプトを起動して
c:\>python -V
Python 2.7.15
c:\>py -V
Python 3.7.0

という具合に簡単に使い分けることができた。

2018年6月23日土曜日

Ubuntu(デスクトップ 18.04 LTS)をVirtualBox上にインストールしてsshとRDPで接続可能な様に設定する

今回はUbuntu(Serverではなくデスクトップを入れてみる)まずは時間がかかるのでISOイメージをダウンロードしておく。
https://www.ubuntu.com/download/desktop
現在の最新版は、Ubuntu 18.04 LTS。
デスクトップ環境はデフォルトのGnomeでやってみたい。

VirtualBoxでマシンを作成。

Desktop版はそれなりにメモリを食うようなので一応メモリは4GB確保しておく。

ディスクサイズは、25 GB of free hard drive spaceと書いてあるので念のため可変ディスクで40GB確保。

デカい・・・。

作成したら右クリック→設定で「ubuntu-18.04-desktop-amd64.iso」ファイルをマウント。

ネットワーク設定をNATにして高度な設定を開き、ssh(port 22)、RDP(port 3389)をポートフォワーディングしておく。

OKで設定を保存して→ボタンで起動。

Englishのままでもいいが、今回は日本語にしてUbuntuをインストールをクリック。

キーボードレイアウトを検出は試してみたらヘブライ語とかになったりあまり使えないご様子なので、そのまま続ける。

アップデートと他のソフトウェアは今回特に変更しない。

ディスクを削除(=上書き)のままでインストール。

そのまま続ける。

タイムゾーンも特に変更なし。

名前とpasswordはとりあえず今回は全部ubuntu、個人使用なので自動ログインにしてしまう。

インストールが開始されるので待つ。(かなり時間がかかった)

終わったら再起動。

自動ログインに設定したのでそのままデスクトップが表示。


起動してきたらまずはopensshserverのインストール。
$ sudo apt install -y openssh-server

sshのpasswordログインを許可。
$ sudo vi /etc/ssh/sshd_config
で「# PasswordAuthentication yes」を#を削除しアンコメント。

サービスの設定。
$ sudo systemctl enable ssh
$ sudo systemctl restart ssh

これでlocalhost:22にsshでログインできる用になった。

次、XRDPを入れていきたい。
$ sudo apt install -y xrdp

セッション情報の設定を追加。
$ sudo vi ~/.xsessionrc
記載内容は次の通り
export GNOME_SHELL_SESSION_MODE=ubuntu
export XDG_CURRENT_DESKTOP=ubuntu:GNOME
export XDG_DATA_DIRS=/usr/share/ubuntu:/usr/local/share:/usr/share:/var/lib/snapd/desktop
export XDG_CONFIG_DIRS=/etc/xdg/xdg-ubuntu:/etc/xdg
new_cursorsの無効化。
$ sudo sed -e 's/^new_cursors=true/new_cursors=false/g' -i /etc/xrdp/xrdp.ini

サービスの設定
$ sudo systemctl enable xrdp
$ sudo systemctl restart xrdp

Authentication Requiredダイアログの回避。
$ sudo vi /etc/polkit-1/localauthority/50-local.d/xrdp-color-manager.pkla
以下を追記、
[Netowrkmanager]
Identity=unix-user:*
Action=org.freedesktop.color-manager.create-device
ResultAny=no
ResultInactive=no
ResultActive=yes
polkitのリスタート。
$ sudo systemctl restart polkit

Windowsからrdpで接続してみる。

何とか成功。

ただしこの設定だとVirtualBos上のUIからはログアウトしないとRDPではログイン出来ない点と、起動後の初回ログイン時に「カラープロファイルを作成するには認証が必要です」という無駄な認証画面↓が2回出てしまうようで面倒だ。

これらが解決出来たら追記しようと思う。

※参考サイト
https://www.hiroom2.com/2018/04/28/ubuntu-1804-xrdp-gnome-ja/

2018年6月22日金曜日

MicrosoftのリリースしたOSSテスト自動化ツールWinAppDriver UI Recorder

http://www.atmarkit.co.jp/ait/articles/1806/22/news036.html
率直に言うと上記の記事を読んで、まずこれがどういうものかについて、今一不勉強でよくわからなかったので調べてみた。

ざっくり言うとWebdriverというAPIを用いて自動テストを走らせるためのソフトである、WinAppDriver用のC#のソースコードを、操作を記録して自動生成するツールということになるようだ。

Webdriverというのは、ざっくりいうともともとはSeleniumという、Webに対する自動テストOSSで使われている、JAVAやC#を含む好きなプログラミング言語でテストを記述し、WebdriverAPIを使って、同じテストを
 Linux→Chromeドライバ
 Windows→IEドライバ
 etc...
というような各プラットフォームのドライバ(要するに自動操作を受け付けるためのサーバです)に実行させる仕組み。

このWebdriverの仕組みは前述の通りもともとはWebアプリケーションの自動テストで使われていましたが、現在ではAppiumという名称でAndroidやiOS用のドライバやWindows向けには WinAppDriver等々の各種プラットフォーム向けのドライバーが開発されて、モバイルやアプリケーションの領域まで拡張されてきた。
また、このWebdriverの仕組みはW3Cでも標準化されるなど(https://www.w3.org/TR/webdriver/)テスト自動化ツールではかなり主流といって良い仕組みになっている。

例えば電卓を起動して123+456を計算し、電卓を閉じるという操作を行った場合の出力コードは次のようなものになっているようだ。
// KeyboardInput VirtualKeys="Keys.Command+ "" + Keys.Command"calc"Keys.Return" CapsLock=False NumLock=True ScrollLock=False
Console.WriteLine("KeyboardInput VirtualKeys=\"Keys.Command+ \"\" + Keys.Command\"calc\"Keys.Return\" CapsLock=False NumLock=True ScrollLock=False");
winElem0.SendKeys(Keys.Command+ "" + Keys.Command);
winElem0.SendKeys("calc");
winElem0.SendKeys(Keys.Return);

// KeyboardInput VirtualKeys=""123+456"Keys.Return" CapsLock=False NumLock=True ScrollLock=False
Console.WriteLine("KeyboardInput VirtualKeys=\"\"123+456\"Keys.Return\" CapsLock=False NumLock=True ScrollLock=False");
winElem0.SendKeys("123+456");
winElem0.SendKeys(Keys.Return);

// MouseHover on "表示は 579 です" at (193,2)
Console.WriteLine("MouseHover on \"表示は 579 です\" at (193,2)");
string xp3 = "/Pane[@Name=\"デスクトップ 1\"][@ClassName=\"#32769\"]/Window[@Name=\"電卓 ‎- 電卓\"][@ClassName=\"ApplicationFrameWindow\"]/Window[@Name=\"電卓\"][@ClassName=\"Windows.UI.Core.CoreWindow\"]/Text[@AutomationId=\"CalculatorResults\"][@Name=\"表示は 579 です\"]";
var winElem3 = MyDesktopSession.FindElementByXPath(xp3);
if (winElem3 != null)
{
   //TODO: Hover at (193,2) on winElem3
}
else
{
    Console.WriteLine($"Failed to find element {xp3}");
    return;
}
一見してわかる通り、そのまま使えるケースはよくあるキャプチャ&リプレイ系のツールと同じく、恐らく稀で、現実的にはプログラミング言語によるテストコードの開発を支援するツールという位置づけになりそうだ。

開発プロセスにもよりそうだが、Webdriver回りのフレームワークでは、基本的に開発者がテストコードを作るあるいは、テストコードを先に作ってそれを満たすソフトを開発するというのが想定されているようで、従来こういったキャプチャリプレイ系のツールというのはこれまであまり出てきていない様に見える。

SeleniumではSelenium IDEやSelenium builderというキャプチャ&リプレイツールが存在するものの、あまり活発とは言えない状況に見える。
半ば想像ではあるがこの理由は開発者がテストコードを作るのであれば、基本的にキャプチャツールはそれほど必要ないのと、キャプチャは当然ながらある程度動くプロトタイプが仕上がってからでないと使い物にならないため、開発初期の単体テストやフォーム単位の動作確認等ではあまり役に立たないという事情があるのではないかと思う。
そういった意味では今後、Microsoftがどのくらいこれをメンテナンスし続けていくかは注目に値しそうだ。

※もしご存じの方で理解が違う点があれば、突っ込みいただければ幸いです。

2018年6月20日水曜日

Ubuntu Serverをバーチャルボックスへインストールしssh接続可能な設定をして仮想アプライアンスを作成

故あって普段慣れているRHEL系のCentosではなくUbuntuも使う必要が出てきたので、Ubuntu Serverをバーチャルボックスへインストールし仮想アプライアンスを作成してみたい。

まずデスクトップだと重そうなのでこちらからUbuntu ServerのISOをダウンロード。
https://www.ubuntu.com/download/server

次のような設定でマシンを作成。

右クリックの設定からストレージにダウンロードしたISOファイルをマウント。

作業はsshでやりたいので、22をlocalhostからリダイレクトしておく。

→ボタンでマシンを起動。

あ、Ubuntu ServerのインストーラってCLIなんだ、知らなかった。日本語ないし。。。
まーやってみたらマウスが無いだけで、実質GUIに近いCLIかも。

仕方ないのでEnglishを選択。

そのままDone

もちろんInstall Ubuntu、そのままEnter。

DHCPになってるのでそのままDone。

自宅ではProxyは不要なのでそのままDone。

パーティションも今回は特にこだわらないのでそのままDone。

CDにインストールしても仕方ないので、VBOX_HARDDISK*を選択してEnter。

そのままDone。

Noを選んでも仕方ないのでContinue。

ユーザ名等は適宜。Ubuntuでは普通にインストールしたのではrootではログインさせてくれないらしいので、仕方なくユーザを作っておく。今回は面倒なのでubuntu/ubuntuとかにした。
※ちなみに試しにrootってユーザ名にしてみたらホームディレクトリが作れないとか言って落ちた。。。
sshキーのインポートは面倒くさいので今回はパス。

っていうかこの画面ですでになんかインストール始めてるみたいなので、一瞬早く入力しないといけないの?とか思ったがそんなアホなつくりには、さすがになっていなさそうなので、ゆっくり入力すればOK。

無事終わったようなのでReboot Now。

Please remove the installation medium, then press Enter:と言われたが、ディスクは勝手にアンマウントされていた。

とりあえずログインできたので成功?

ping 8.8.8.8も通るしまぁ大丈夫そう。

Firewallの設定
$ sudo ufw allow 22
$ sudo ufw reload

CentosだとこれでID/PWでsshログインできるんだけど、Ubuntuはどうなんだろう?
・・・だめらしい。やっぱなれない環境は面倒臭いな。

sshサーバ入れてみる。
$ sudo apt-get install -y openssh-server

あれ、入ってるじゃん。

設定か、
$ sudo vi /etc/ssh/sshd_config
で見てみると、「# PasswordAuthentication yes」
こんな行があったのでアンコメントしてみる。

OK完了。とりあえずこれでバーチャルアプライアンスにしておく。
$ sudo shutdown -h now

でシャットダウン後にVirtualBoxのメニューでファイル→エクスポートからエクスポートで完了。

余談だが、CentosのMinimalインストールしたバーチャルアプライアンスが660MBだったのに対して、Ubuntu Serverのバーチャルアプライアンスは1.1GBもあった。

しかし、毎回sudoが要求されるのがCentosでrootで作業に慣らされた身としては面倒臭い。
特にviをsudoせずに開いて頑張ってconfig設定した後に権限で文句言われるとかマジでつらい。
慣れりゃどうってことないんだろうけど。

ウェブサイトのURLにおけるトレイリングスラッシュの解釈と有無による動作の違い

インターネットが現代社会におけるコミュニケーションの基盤となっている今日、ウェブサイトのURLはビジネスや個人ブランディングにとって重要な役割を果たしています。URLは単にウェブページへの経路を示すだけでなく、SEO(検索エンジン最適化)においても重要な要素です。この記事では、U...