自動UIツールを比較!!

UIテスト自動化導入

1.UIテスト自動化導入のメリット・デメリット


1.メリット

・作業時間の軽減。
・キャプチャ・リプレイ機能があるので、エビデンスの偽造・加工ができないし、面倒でもない。
・サイトを追加機能した場合に、別のサイトが動かなくなることも発見できる。
・ブラウザのバージョンアップでサイトが動かなくなることがあっても、短時間で発見ができる。
・毎回ポチポチと画面テストするのは工数的にもモチベーションにもよくないし、他の作業が出来る。
・「正確さ」と「単調さ」は人間よりも機械が向いてる。

2.デメリット

・テスクスクリプトをしっかりと複数人で作らないと、属人化する恐れがある。
・機能が追加/変更されていくにつれ、テストケースも増えたり変わったり不要になるので、メンテナンスも実は大変。
JAVAの知識が必要。

自動化システム導入は、苦労を伴うが、リターンが大きいこと違いない!

2.UIテスト自動化製品について


1.共通事項

 ・複数言語に対応(JavaC#PythonRubyJavaScript(Node.js))
 ・複数Webブラウザに対応(ChromeFirefoxInternet ExplorerMicrosoft EdgeOperaAndroid標準Webブラウザ、iPhone)
 ・複数のOSに対応

2. Sleniumとは


 ・Seleniumはツールの集合体。単体のツールで無く、Selenium WebDriver、Selenium Server、Selenium IDESelenium RCとある。
 ・バージョンは最新の3で最新である。 Selenium WebDriverの知識だけでよい
 ・情報量が多い。

3. Selenideとは


 ・ Selenium WebDriver のラップラップしたブラウザテストの自動化フレームワーク

 ・初めからUIテストのために設計されていて、簡単にテストスクリプトを書いて実行

 ・Ajaxのテストが簡単らしい

 ・情報量はまだまだ少ない。

4.検証環境(Windows)

ブラウザは全てCromeで実施。


1.Selenium
・OS:Winodws 7
・開発環境: Eclipse
Python :3.5.1
JAVA:“1.8.0_151”"
・chromedrive:2.3
・Crome:62.0.3202.89

2. Selenide
・OS:Winodws 7
・開発環境: Eclipse
JAVA:"1.8.0_151“"
JUNIT
・Crome:62.0.3202.89

5.検証環境(Linux


1.Selenium

・OS:CentOS Linux release 7.4.1708 (Core)
Python :3.5.1  ・JAVA:”1.8.0_151”
・言語:JUNIT
・chromedrive:2.3
・Crome:62.0.3202.89
Selenium:3
・仮想ディスプレイ:Xvfb(仮想ディスプレイ)+ヘッドレスモード(Crome)

2.Selenide

・OS:CentOS Linux release 7.4.1708 (Core)i  ・JAVA:“1.8.0_151”"
・言語:JUNIT
・chromedrive:2.3 ・Crome:62.0.3202.8
Selenium:3
・仮想ディスプレイ:Xvfb(仮想ディスプレイ)
・ヘッドレスモード(Crome)は動作できず。今後の課題!

6.製品の比較(SleniumとSlenaide)


1.情報量: Slenium > Selenide

・まだまだ、歴史があるSleniumに比べると、Selenideは情報が少ない

2.環境構築の工数:Slenium> Selenide

・情報量の多さで、Sleniumのほうが難易度は低い。
・Selenideは、情報量が少なくPytonが利用できない。JAVAの知識(JUNITコンパイル・ビルド製品なども)
→ Pyton版とSlenaideも出てきているらしい(検証はしていない)
Javaに慣れた人なら、問題はない。

3.操作性: Selenide > Slenium

・ブラウザの閉じ方とか、タイムアウトとか、扱い方などを考える必要はなく、ソースの作成が難しくない。

4.拡張性: Selenide > Slenium

・初めからUIテストのために設計されていて、UIテストを「スラスラ」書いて実行できます。

7.所感


1.ブラウザについて

・ブラウザのデフォルトは、FireFoxであるが、主流はCromeになっていくと思われる。
・ドライバを変えることで、トラブルをそれぞれ抱えている。複数のブラウザが利用できるのが特徴ではあるが、統一したほうがよいと思う。
・ブラウザの進化のスピードとても早く、WebDriveのバージョンアップが随時適切に必要。ブラウザの仕様変更で動作しなくなることもある。
・今後はブラウザを構築している団体が、ドライバをメンテナンスすることになるので、トラブルは減るかも。

2.ソフトウェアについて

・ Slenaideを選定したい。
情報量は少ないが、テストスクリプト作成の難易度は低く、スラスラ動く。Pytonも使えるようになりそう。

Selenium IDEGUIで操作できるため、利用ユーザも多いので便利だと思ったが、ブラウザの進化にいてけず、今は利用できない。
その他のIDE製品も出ているが、突然利用できなくなる可能性があるのが欠点。

・VIでJAVAのテストスクリプトのメンテナンスをすると、テストスクリプト作成に時間とトラブル対応に時間がかかるかも。
フリーのEclipseやPyCharmの統合開発環境を用意したほうが、保守性が高く、修正時間も短い。

3.その他

・単純にツールだけあればいいということではない。設計段階でテスト業務にきっちり組み込ませる必要がある。
・テストスクリプトの作成にそれなりに時間がかかる。テストを実行するのにコストがどれだけかかるかを 検討するのが何より必要。手動で実施したものがよいものもある。
・案件毎でテスト設計を組み込まないと、ツールの導入だけのとなり、継続的に利用ができない。
必要に応じた自分たちに合った手法を考えなければいけない。また、運用のノウハウは時間をかけて作るしかない。

AWSでNATインスタンスを作成する方法

NATインスタンスの作成方法を作ってみましょう。

まず、NATの必要性は何でしょう。

NATの必要性

・インターネットから接続される必要のないインスタンスについて、 インターネットからの接続を遮断しつつ、自身はインターネット接続 を出来るようにする ・外部から接続される危険性を減らすこと

実装したいこと

EIP(グローバルアドレス)』を持たないため、通常はインターネット通信が不可能。

インターネットへの通信要件として、下記である。 ①AWS標準NTPサーバに対しての時刻同期通信 ②パッケージのセキュリティアップデート

パブリックサブネットにNATインスタンスを構築し、NATインスタンスを中継したインターネットへの通信を可能とする。

NATインスタンス構成

①プライベートサブネットの各サーバは、NATインスタンスを中継しインターネットへの通信を行う。 インターネットとは『Outバウンド』の通信のみ可能。『Inバウンド』の通信は不可能。

②パブリックサブネットのNATインスタンスは、EIP(グローバルIP)を保持させインターネットと直接通信を行う。インターネットとは『Inバウンド』、『Outバウンド』通信ともに可能。

NATインスタンスの選択

・NATインスタンスは、AWSが提供する『 Amazon Linux AMI 』を利用する。 ・NATインスタンスの『 Amazon Linux AMI 』は、EC2作成時にコミュニティAMIから文字列 "amzn-ami-vpc-nat" で検索する。  >ルートデバイスタイプ:ebs  >仮想化タイプ:hvm

NATインスタンスの仕様

(1)IPv4 転送が有効となる。 (2)ICMP リダイレクトが /etc/sysctl.d/10-nat-settings.conf で無効とする (3)/usr/sbin/configure-pat.sh にあるスクリプトが起動時に実行され、iptables IP マスカレードが設定される。

NATインスタンスの送信元/送信先チェックの『無効化』

EC2インスタンスは、『送信元/送信先チェック』(※)をデフォルトで実行する。 NATインスタンスはパケットの送信元IPアドレスや宛先IPアドレスを書き換えるため、『送信元/送信先チェック』を『無効』にする。

(※)パケットを受け取るには、そのインスタンスが送受信するトラフィックの送信元、または、送信先である」という条件が課せられている。  この条件を「送信元、送信先チェック」と言う

1 AWS マネジメントコンソール にIAMアカウントでサインイン

2 AWS マネジメントコンソールの右上隅で、[Tokyo]リージョンを選択する

3 Amazon EC2 コンソールを開く

4 ナビゲーションペインで、[EC2] を選択する

5 [インスタンスの作成] を選択する。

6 [ステップ 1: Amazon マシンイメージ (AMI)] ページで、コミュニティAMIからNATサーバAMIを選択する。

7 [ステップ 2: インスタンスタイプの選択] ページで、作成するインスタンスタイプを選択し、[次の手順:インスタンスの詳細の設定]を押下する。

項目 設定
インスタンス [1] を入力
購入のオプション 購入のオプション
ネットワーク VPCを選択
サブネット 『サブネット』を入力
自動割り当てパブリック IP be
IAM ロール 『なし』を選択
削除保護の有効化 チェックを入れる
モニタリング チェックを入れない

8.[ステップ 4: ストレージの追加] ページで、作成するインスタンスタイプを選択、入力し、[次の手順:タグの追加]を押下する。

項目 設定
サイズ(GB) [任意にを入力
ボリュームタイプ 任意に入力
合わせて削除 チェックを入れる

9.[ステップ 5: タグの追加] ページで、タグを作成し、[次の手順:セキュリティグループの設定]を押下する。

10.[ステップ 5: タグの追加] ページで、タグを作成し、[次の手順:セキュリティグループの設定]を押下する。

項目 設定
タグ 追加なし

11.[ステップ 6: セキュリティグループの設定] ページで、セキュリティグループを作成し、[確認と作成]を押下する。

セキュリティグループの割り当て 新しいセキュリティグループを作成する』を選択
セキュリティグループ名 任意
説明 任意
セキュリティグループのルール 任意

12.[インスタンス作成の確認] ページで、確認を行い[作成]を押下する。

13.作成を押下する。

Pandocにトライしてみましょう。

最近資料を作る場合は、WordやEXCELでするのが面倒でMarkdown形式のgitbookでPDFやHTML化をすることが多いです。

Markdownは慣れてしまえば、間単に書くことができ、議事録や仕様書を作成するにはもってこいです。

Markdownの書き方は下記を参考にしてください。

http://yoshilover.com/?p=74

Pandocとは

Pandocは異なる形式のドキュメントやマークアップ言語を変換することができるツールです。

gitbookは、MARKDOWNからPDFやHTMLへの一方方向へしか変換できませんでしたが、Pandocを 用いれば双方向が可能となります。

特徴

対応フォーマットが非常に多いです。

入力形式

markdown ・reStructuredText ・textile ・HTML ・DocBook ・LaTeXMediaWiki markup ・TWiki markup ・OPMLEmacs Org-Mode ・Txt2Tags ・Microsoft Word docx ・EPUBHaddock markup

出力形式

XHTMLHTML5 ・HTML slide shows using Slidy ・reveal.js ・Slideous ・S5 ・DZSlides ・Microsoft Word docx ・OpenOffice/LibreOffice ODT ・OpenDocument XMLEPUB version 2 or 3 ・FictionBook2 ・DocBook ・GNU TexInfo ・Groff man pages ・Haddock markup ・InDesign ICML ・OPMLLaTeX ・ConTeXt ・LaTeX Beamer slides ・PDF ・Markdown (including CommonMark) ・reStructuredText ・AsciiDoc ・MediaWiki markup ・DokuWiki markup ・Emacs Org-Mode ・Textile

pandocのインストール

rpmパッケージがあるので、yumで簡単にインストールできます。

yum install pandoc

操作はとても簡単です。

マークダウンからワードに変換する場合

pandoc README-JP.md -o README-JP.docx pandoc -f markdown -t html hoge.md

以下のようにも書けます

pandoc --from markdown -to html hoge.md

これで変換された文章がコマンドラインに表示されることになります。 標準出力なのでパイプ等で他のコマンドに引き渡しが可能です。

また標準出力ではなく、ファイルに保存したい場合は以下のように書けば良いです。

pandoc -f markdown -to html -o hoge.html hoge.md

-oは–outputオプションの短縮形で、出力先ファイルを指定するものです。変換したhtmlはhoge.htmlに保存されることになります。

まとめ

もうエクセルやワードが時代遅れになりつつあります。 Markdownを覚え、だめなおじさんにはならないようにしましょう。

Vagrantのインストール方法は?

Vagrantのインストール

環境


開発環境 

Vagrantのbox:CentOS 7 x64 (Minimal, Shrinked, Guest Additions 4.3.26)

ホストマシン

Windows 7 Home PremiumVagrant 1.7.2 ・VirtualBox 4.3.26-98988

ゲストマシン  

CentOS 7


Vagrantのboxの選択


VagrantのBOXを選択する必要がある。 CENTOSのboxを選択するには、Serachで「CENTOS」と入力する。 BOXにしたいバージョンを選択する。  

(URLはこちら) http://www.vagrantbox.es/

(参照)

検索結果から目的のboxにある"コピー"をクリックする。 ここでコピーしたURL文字列をVagrantのbox addコマンドで用いる。


Vagrantのboxから仮想マシンを生成


コマンドプロンプトにて下記を実行

vagrant box add https://atlas.hashicorp.com/viniciusfs/boxes/centos7/

==> box: Loading metadata for box 'https://atlas.hashicorp.com/viniciusfs/boxes/ centos7/' This box can work with multiple providers! The providers that it can work with are listed below. Please review the list and choose the provider you will be working with.  

1) libvirt

2) virtualbox

3) vmware2

Enter your choice: 2 ==> box: Adding box 'viniciusfs/centos7' (v1.0.1) for provider: virtualbox box: Downloading: https://vagrantcloud.com/viniciusfs/boxes/centos7/versions /1.0.1/providers/virtualbox.box box: Progress: 69% (Rate: 1968k/s, Estimated time remaining: 0:01:43)

Vagrantのバージョン確認

vagrant -v

Vagrant 2.0.1

追加されたboxを確認する

vagrant box list

viniciusfs/centos7 (virtualbox, 1.0.1)


仮想マシンの起動


コマンドプロンプトで以下のとおり実行する。

vagrant up


注意事項


・Vagrant2.01ではPowrShellが2系から5系にバージョンアップする必要がある。 ・立ち上がらない場合は、Vagrantfileを変更する必要がある。


単体テストとJUNIT5

プログラミング開発において、テストフェーズは下記に大きく分けられます。


1.単体テスト 2.結合テスト 3.機能テスト 4.システムテスト 5.ユーザ受け入れテスト


テストの目的とはなんでしょうか。

バグを発見すること 品質を保証すること 品質を改善すること

バグを防ぐのはいつでもエンジニアの課題でしょう。

今回は、Seleniumの検証中でもあり、単体テストについて触れてみたいと思います。

単体テストとは

・クラスや関数などのプログラム単体でのテスト ・設計通りに動くかを検証 ・テスティングフレームワークを使ったテストプログラムで、メソッドなどの小さな単位で行うテスト ・個々の機能を正しく果たしているかどうかを検証するテスト

実装中段階の早期段階で、機能が仕様通りに実装されているかを確認することにより、開発の後工程で行われるテストに比べて早い段階でバグをつぶすことができます。

必要な理由


・問題の原因の特定や修正が容易。 ・開発全体のバグ修正コストを下げる ・コードの内容をよく理解している開発者によって、コード作成と同時か直後にテストケースが作成できる


単体テストの課題は


・開発者への負担 ・ある程度のスキルが必要 ・スケジュール的に厳しい


テストプログラムには、JUNITが利用されます。

JUNITとは


Java開発では多くのプロジェクトでオープンソースの「JUnit」が使われています。 JUnitJavaプログラム単体テスト用のフレームワークです。

共通のテストフレームワークをもつことで、他人のテストプログラムの修正を容易にします。

また、テストプログラムを記述するために、たくさんの知識を習得する必要はありません。数個の規則を学べばよいのです


JUNITの現状


単体テストの重要性は誰もが把握していますが、テストプログラミングに時間が取れない。 ・ユニットテストを行うのは原則としてプログラマです。専門の知識は必要ありませんが、 基礎的な知識やスキルはが必要となります。 ・HTMLやCSSについても、最低限の知識やスキルが必要。


問題点


JUnitを使った単体テストは、テストコードを書く必要があり。 ・テスト対象と同じくらい、またはそれ以上のコード量が必要 ・意図した通りにテストが動くかを確認するためにはデバッグが不可欠 ・単体テストにも慣れが必要


推奨される理由


・一度作成すればすばやくテスト可能 ・テストコードを標本とすることでバグ訂正が容易 ・IDEを使うことで、テストコードの再作成によって生じる手間を軽減または高速化 ・テストコードを見れば仕様がわかる


JUNIT4 から5へ

2017年にはJUnit5 がリリースされました。


・サポートされるJavaのバージョンは8です。今後は9にも対応します。 ・最初のハードルが高いため、直感的な仕様となっている。 ・JUnit 4とは互換性がない。 ・既存のテストを書き換えないほうがよい。 ・インストールは、Maven Centralにデプロイされています。


今後は


seleniumやselenideなどで自動化する動きがありますので、需要はますます上がるでしょう。


Selenium+Pythonインストールをインストールしたことある?

Seleniumとは、Webの自動テストのためのライブラリ。 Python版のSeleniumをインストールしたいと思います。

開発環境


ホストマシン

・Vagrant2.0.1 ・Windows 7 Home PremiumVagrant 1.7.2 ・VirtualBox 4.3.26-98988

ゲストマシン

CentOS Linux release 7.3.1611 (Core)

ソフトウェア

Python :3.5.4 ・JAVA:"1.8.0_151" ・chromedrive:2.3 ・Crome:62.0.3202.89 ・Selenium:3


EPELリポジトリのインストール

CentOSのパッケージは枯れたものが多いので、外部リポジトリを 追加することで新しいパッケージを利用できるようにします。


$sudo yum -y install epel-release


ChromeDriverのインストールの事前準備


$sudo yum -y install wget $sudo yum -y install unzip $wget https://chromedriver.storage.googleapis.com/2.33/ chromedriver_linux64.zip   

$sudo unzip chromedriver_linux64.zip $sudo mv chromedriver /usr/local/bin/ $sudo chown root:root /usr/local/bin/chromedriver   


Google Chromeのインストール  

参考URL: [CentOS7にChromeをインストール] (https://qiita.com/shadowhat/items/af6b973df43d75abfe8e)


/etc/yum.repos.d/google-chrome.repoでリポジトリファイルを設定。

sudo vi /etc/yum.repos.d/google.chrome.repo

Viで内容を入力

[google-chrome] name=google-chrome baseurl=http://dl.google.com/linux/chrome/rpm/stable/$basearch enabled=1 gpgcheck=1 gpgkey=https://dl-ssl.google.com/linux/linux_signing_key.pub

インストールする

sudo yum -y install google-chrome-stable

Chromedriverは2.31以降をインストールしてください。 2.30以前ですと、seleniumでsend_keysが使えない問題が 発生していたのですが、2.31でこの問題が解消しています!


PIPのインストール方法


python-devel を入れる

sudo yum -y install python-devel

python-pip をインストールする

sudo yum -y install python-pip  

パッケージをアップデートする。

sudo yum -y update


JAVAのインストール


sudo yum install -y java-1.8.0-openjdk.x86_64 sudo yum install -y java-1.8.0-openjdk-devel.x86_64


pythonを2系から3系にアップさせる。


pyenvをインストールすることで複数のバージョンのpythonを共存させて 簡単に切り替えることができます。

$ git clone https://github.com/yyuu/pyenv.git ~/.pyenv bash_profileに環境変数を記述します。

$ vim .bash_profile 下記を追記 $ pyenv export PYENV_ROOT="$HOME/.pyenv" export PATH="$PYENV_ROOT/bin:$PATH" eval "$(pyenv init -)"

.bash_profileを読み込ませる  

念のためコマンドを読む

export PYENV_ROOT="$HOME/.pyenv" export PATH="$PYENV_ROOT/bin:$PATH"

インストールできるバージョンを一覧表示

pyenv install --list

3.5.4をインストール

$ pyenv install 3.5.4   pythonのバージョンを確認  

$ python --version Python 2.7.5

python3.5.1に切り替え

$ pyenv global 3.5.4 $ pyenv rehash $ python --version Python 3.5.4


Seleniumのインストール


pip install selenium


バージョンの確認方法


java -version google-chrome -version python --version


実行


python test.py

まとめ

ChromeDriverの実行ファイルは、ご利用のGoogle Chrome のバージョンに合わせて適切な組み合わせを選ぶ必要が有ります。 また、Google Chrome自体は自動アップデートしていくので、 開発環境のChromeDriverも追随していく必要が有ります。


標的型攻撃メールの対策はAWSでできるのか?

標的型メールが流行っている昨今、特定のメールからしか受信をしないのであれば、メールドメイン単位でフィルタリングが出来るのだろうか。

特に大手企業のドメインは有名であり、中国からもよく狙われています。

SESでAWSを導入すればよいが、EC2でのMTAを実装を考えており、検討してみた。

AWS構成】

・ELB + EC2 + RDS ・EC2からメール受信時に、メールサーバのドメイン名 (FQDN)でアクセス権限をかける ・EC2にMTAをもつ

本来であれば、IPでの制限については、セキュリティグループとNACLで可能であり、 こちらで制限できるか、確認した。

セキュリティグループとNACLの違いは?

簡単にいうと、セキュリティグループはインスタンスレベルで動作。

NACLは、サブネットレベルで動作で動作。

比較をして見ましょう。

セキュリティグループ NACL
インスタンスレベルで動作 サブネットレベルで動作
ステートフル: ルールに関係なく、返されたトラフィックが自動的に許可 ステートレス: 返されたトラフィックがルールによって明示的に許可
該当のトラフィックを許可する前に全ての許可設定を評価 該当のトラフィックを許可するとき、ルール番号順にACLのルールを処理
インスタンスを起動するときのみ指定 サブネット内で起動した全てのインスタンスに対して自動的に適応

セキュリティグループはAWSに触れるひとであれば、当たり前の知識であるかもしれませんが、NACLはあまり設定をすることはないかもしれませので、もう少し深く説明しましょう。

NACLについて

・NACLは、ルールに番号付けしたリスト。 ・ACLに関連づけられたサブネットの入りと出のトラフィックのに対して小さな番号順に許可される。 ・インバウンドまたはアウトバウンドのトラフィックについて、個別に許可と拒否を設定 ・VPCは自動的にデフォルトACLに属します。初期設定で全ての入りと出のトラフィックを許可 ・任意にカスタマイズしたACLを追加可能 ・カスタムACLは、初期設定として全ての入りと出のトラフィックを拒否 ・許可ルールを追加することで通信可能 ・どのサブネットもACLを関連づける必要があり。 ・サブネットにACLを指定しない場合には、デフォルトACLが適応されます。 ・ACLはステートレスです。レスポンスの通信を許可する必要あり

フィルタできない通信は?

では、セキュリティグループとNACLで防げない通信はあるのでしょうか。

セキュリティグループとNACLは、リンクローカルアドレスに関するトラフィックをフィルタすることができません。 リンクローカルアドレスとは、VPC内で動いているDNSサーバー、DHCPAmazon EC2指定のメタデータです。 もし、これらの通信をブロックしたければ、EC2内にオリジナルのファイアウォールを設定すればブロックすることができます。

それでは本題であるFQDNの通信は?その他のWAFなどを用いてでできるだろうか?

残念ながら、 AWS サービスの機能を利用した方法では、このような要件を満たす方法はありませんでした。

このため実現方法は、セキュリティグループやネットワーク ACL を更新するスクリプトを作成するか、インスタンス内の iptables などで実施する必要があります。

iptabelsはCENTOS7では使われない技術になってきておりますが、Linuxで最も使われているファイアウォールです。

ドメインで止められないのであれば

それでは下記のように設定しましょう。

似たようなIPなので傾向を見るため、一定期間メールログからアクセス元のIPを抽出する。

それらを並べてみると、大体近いIPアドレスが多いのに気づく。

IP業者が使うであろうアドレスを含む広い範囲を遮断すればよい。

「国/地域別IPアドレス割当数一覧」というサイトを利用する。

数百個あるIPアドレスも複数のグループに分けられるはずだ。

iptabelsで下記のコマンドで設定する。 複数のコマンドをそれぞれ実行。

iptables -I INPUT 2 -s xx.xxx.xxx.xxx/12 -j DROP

そのあとは、リスタートすればよろし。

まとめ

AWSに関わらず、標的型メールが流行っている昨今、特定のメールドメインのブロックをオンプレのファイアウォールでも設定の可能・不可能があった。

AWSでは今は設定できないことではあるが、需要は多いと考えられるので、ぜひ実装してほしい。