Webプロジェクトのテスト。 jsFUnit

Webプロジェクトのテスト。 js F ユニット

プロのプログラミングでは、自動化されたテストが大きな役割を果たします。 彼らはプロのテスターのチームを置き換え、他の部分で発生した問題を提案します。
開発中の大規模なプロジェクト。 Webアプリケーションは、Gecko、Presto、KHTML、WebKit、およびTridentのさまざまなブラウザーエンジンでテストする必要があります。

さまざまな自動テストが機能テストです。 主な機能は、アプリケーションでのユーザーの作業のエミュレーションです。
インターフェイスを介して。 Webプログラミングでは、Seleniumを使用して機能テストを記述します。 Seleniumaの大きな欠点は、そのようなテストの実行速度が遅いことです。

より高速なフレームワークは、jsUnitであることが判明しました。 確かに、jsUnitは機能テストではなくユニットテストを作成するように設計されています。 他にもいくつかの小さな欠陥があります。 どういうわけか-
リストからテストを選択するのではなく、パスに沿ってテストにアクセスします。 少なくとも1つのエラーの場合、スライダー全体が赤く塗られ、テストが正常に完了したか、正常に完了しなかったことに対応する緑/赤の領域に分割されませんでした。

これにより、jsFUnitが作成されました。



js F ユニットは、テストを実行するためのインターフェースと2つのライブラリで構成されます:条件チェックライブラリ(さまざまなアサート関数)と、ユーザーのウェブインターフェースでの作業をエミュレートする関数のライブラリ およびperlスクリプト
(update.pl)新しいテストを登録します。

私はSurceforgeにjs F ユニットを見つけました。そこからみんなにダウンロードすることをお勧めします: http ://sourceforge.net/projects/jsfunit/files/

js F Unit -2.1.zipをダウンロードしたら、Webプロジェクトのpublic_htmlで解凍します。 public_html / testsディレクトリが表示されます。 すべての読者がpublic_htmlとは何かを知っていることを願っています。 しかし、誤って記事を読み始めた人のために、Windowsマシンを使用して、xamppをhttp://www.apachefriends.org/en/xampp.htmlの c:\ xamppからインストールし、 js F Unit -2.1.zipを解凍することを提案しますc:\ xampp \ htdocs。

ブラウザで、 http:// localhost / tests (またはホストが持っている他のアドレス)を開きます。 js F Unitインターフェースが表示されます。 それは非常に簡単で、簡単に理解できます。

テストを作成するには:
1. tests / tests-jsディレクトリにテストを追加します
2.テストには拡張子.jsが必要です
3. update.plを実行します( js F ユニットに付属しており、testsディレクトリにあります。これはperlスクリプトです。まず、説明します。
スタート->実行...
cmd
c:\ xampp \ perl \ bin \ perl.exe c:\ xampp \ htdocs \ tests \ update.pl

4. httpを更新:// localhost / tests (F5)

テストはどのように見えますか?

js F ユニット
jsUnit、jUnit、CUNIT、PHPUnit、NUnit、PyUnit、fUnit、DUnit、
FPCUnit、テスト::クラスとテスト::ユニット、CPPUnit、FlexUnit、COSUnitなど

テストファイル自体には、名前にテストプレフィックスが付いた1つ以上の関数があります。 順次起動されます。

関数 testNagan (){
...
}

関数 testBlaster (){
...
}

関数は、Webアプリケーションを操作し、Webアプリケーションが正しく応答していることを確認することを記述します。

関数 testNagan (){
var nagan = new Nagan ()
assertEquals"Naganインスタンスの名前は 'string'型ではありません。ごめんなさい"typeof (nagan.name)、 "string"
}

各テストの開始時に初期化アクションを実行する場合は、setUpを使用できます。
そして最後に-teardown。

関数 setUp (){
protiv_loma_net_prijoma =新しいLom ()
}

関数 Nagan (){
assert"このようなスクラップを投げるのをどこで学びましたか?"protiv_loma_net_prijoma。rasstojanie_v_metrax (20))
}

関数 Sablja (){
アサート「はい、あなたはとても弱いです、私の友人!」protiv_loma_net_prijoma。rasstojanie_v_metrax (1.5))
}

関数 tearDown (){
protiv_loma_net_prijoma。 ポロジット ()
}

そして、ここにチェックのためのjs F ユニット関数があります


assert ([comment]、value)-値が0、 "" 、undefined、false、またはnullの場合、assertはテストを停止し、コメントが指定されている場合はログとともにエラーをログに表示します。 条件は、ブール型の値を返す式でなければなりません。 例: assert“ひどい間違い!!!” 、a == 10 || x <2)
assertTrue ([comment]、condition)はassertの同義語です
assertFalse ([comment]、condition)はassertと同等ですが、条件がtrueの場合はエラーが考慮されます
assertEquals ([コメント]、expected_value、received_value)-受信した値が期待値と一致しない場合はエラー
assertNotEquals ([コメント]、expected_value、received_value)-受信値が期待値と一致する場合のエラー
assertIdentity ([コメント]、expected_value、received_value)-受信した値が期待値と一致しない場合はエラー
assertNotIdentity ([コメント]、expected_value、received_value)-受信した値が期待値と同じ場合はエラー
assertNull ([コメント]、値)-値がnullでない場合はエラー
assertNotNull ([コメント]、値)-値がnullの場合はエラー
assertUndefined ([コメント]、値)-値が未定義でない場合はエラー
assertNotUndefined ([コメント]、値)-値が未定義の場合のエラー: assertNotUndefined (undefined)
assertNaN ([コメント]、値)-値がNaNでない場合はエラー
assertNotNaN ([コメント]、値)-値がNaNの場合はエラー: assertNotNaN (Number.NaN)
失敗 (コメント)-エラー
warn (message、[value])-メッセージを赤でログに書き込みます。 値が指定されている場合、 「message:value」として表示されます
通知 (メッセージ、[値])-緑色でログイン
info (message、[value])-緑色でログイン
debug (メッセージ、[値])-青でログ

インターフェイス操作関数


これらの関数は、一部のSelenium関数に似ています。

ウィンドウと要素を操作するための関数

Defで終わる関数は、失敗するとfalseを返し、例外をスローしません(アサートを参照)。

関数 testOpen (){
win = getWindow"MAIN"//ユーザーが最初に行うことは、Webアプリケーションページを開くことです。
// getWindowは、ページが完全にロードされるまで待機します
//ページは、 js F ユニットと同じドメインにある必要があります
iframe = getFrameWindow (win、 "frame_for_tables"//フレームを操作する必要がある場合があります
}

関数 testForm (){
select (win.document。getElementById( "City" )、 "St. Peterburg"//ドロップダウンリストから都市を選択
clickToButton (win、 "Apply"// [適用]ボタンをクリック
var pwin = openButton (win、 “ Recalculate”// [Recalculate]ボタンをクリックして、Pereschitatqという名前のウィンドウがロードされるのを待ちます
clickToLink (pwin、 “ Menu 1” 、2) // innerHTML = “ Menu 1”で pwinページの2番目の要素をクリックします
}

そして今、より詳細に:

getWindowDef (名前、[時間])

getWindow (名前、[時間])

ウィンドウを名前で返します。


例:


窓:
<html>
<head>
<title> @@ Adminまたはlike ** </ title>
<スクリプト>
window.name = "__ADMIN_ILI_KAK__"
</ script>
</ head>
<本体>
</ body>
</ html>

テスト:
win = getWindow"@@ admin or how **"

waitCondition (cond、time) -condが完了するのを待つ

condが時間ミリ秒でtrueにならない場合-終了

condは、文字列で指定された場合にのみグローバル変数で機能します。 ローカル変数の場合、次の関数を使用します。
var a = 10、b = 10
waitConditionfunction (){return a == b}、500)

睡眠 (時間)

スリープ時間のミリ秒。 似ている:
waitCondition"false" 、500)

waitLoadWindowDef (勝利、時間)

waitLoadWindow (勝利、時間)

勝利時間ミリ秒ウィンドウがロードされるのを待ちます。 ウィンドウが時間内にロードされる場合、待機はすぐに終了します


注意! getWindow関数はすでにwaitLoadWindowを使用しています。 window.openの後にwaitLoadWindowを使用する必要があります。
win =ウィンドウ。 open"localhost / cgi-bin / mypage.pl""name_window"
waitLoadWindow (win、5000)

getFrameWindowDef (win、frame、[time])

getFrameWindow (win、frame、[time])

ページが指定されたフレームにロードされるのを待ち、そのウィンドウのオブジェクトを返します


例:


勝利のページ:
<html>
<本体>
<iframe name = "frame_tab" src = "page_for_this_frame" > </ iframe>
</ body>
</ html>

テスト:
var win_in_frame = getFrameWindow (win、 "frame_tab"

selectDef (sel、テキスト)

選択 (sel、text)

テキストから<select>タグオプションを選択します。
selは要素です。 名前で取得できます: select (document.all.reason、 “ Like this”
<名前を選択= "理由" >
<オプション値= 1>ただし
<オプション値= 2>このように
</ select>

この方法でも同じことが実現できます:document.all.reason.value = 2

linkDef (win、text_in_link、[tag]、[event]、[number])

リンク (win、text_in_link、[tag]、[event]、[number])

テキストtext_in_linkを持つ要素へのリンクを返します: <div> text_in_link </ div>または<a> text_in_link </a>または他の要素


例:


窓:
<html>
<head>
<スクリプト>
window.name = "Admin"
</ script>
</ head>
<本体>
<div id = Div1>性別<b> b </ b>発信者</ div>
<div id = Div2>性別<b> b </ b>発信者</ div>
</ body>
</ html>

テスト:
win = getWindow"Admin"//ウィンドウを取得
div = link (win、 “ Users” 、2) //「Users」というテキストを含む2番目の要素を取得します(Div2)
div.style.color = "red" //赤にする

clickToLinkDef (win、text_in_link、[number])

clickToLink (win、text_in_link、[number])

コンテンツで指定された要素をクリックすると、要素(番号)をクリックするアカウントを指定できます

例:


窓:
<a href= "/users">ユーザー</a>

テスト:
clickToLink (win、 「ユーザー」

clickToButtonDef (win、text_in_value、[number])

clickToButton (win、text_in_value、[number])

ボタンをクリックすると、クリックする項目を指定できます(数字)

例:


窓:
<入力タイプ= "ボタン"値= "ユーザー" >

テスト:
clickToButton (win、 「ユーザー」

openLink (win、text_in_link、[sleepTime]、[time]、[number])

要素をクリックして、同じ名前のウィンドウのオブジェクトを返します


例:


窓:
<script src = "tests / WorkWithHtml.js" >
<スクリプト>
window.name = translate"ユーザー"
// window.name = "Polqzovateli"
</ script>

テスト:
win = openLink (win、 「ユーザー」

openButton (win、text_in_value、[sleepTime]、[time]、[number])

ボタンをクリックして、同じ名前のウィンドウのオブジェクトを返します


結論



1.セレンの欠点:
a)サーバーをインストールする必要があります
b)リソースを要求する
c)サーバーの起動+ブラウザの起動に多くの時間が費やされる
d)Seleniumサーバーはテストごとにブラウザーを再起動します

2. jsUnitの欠点:
a)テストごとにhtmlラッパーが作成されます
b)いくつかのテストを実行するには、スイート()関数を使用して新しいテストを作成する必要があります。
c)テストへのパスは毎回手動でTestRunner(jsUnitインターフェイス)に入力されます
d)デバッグ情報は、一般的なエラーログではなく、別のウィンドウに表示されます

3. jsFUnitの利点:
a)サーバーを必要としない
b)リソースを要求しない
c)ドロップダウンリストからテストまたはテストのグループを選択します
d)実行する必要があるテストのグループは、単に別のディレクトリに配置されます
d)デバッグ情報は一般ログに表示されます
f)スライダーに入力することで、実行されたテストの数を視覚的に評価できます

したがって、jsFUnitは高速で使いやすいため、時間を節約できます。

Source: https://habr.com/ru/post/J86967/


All Articles