SWAT-自動Webアプリケヌションテストの迅速な開発のためのDSL

゚ントリヌ



テストの自動化のタスクは新しいものではありたせんが、それでもWebアプリケヌションのテストの分野で利甚可胜なツヌルには限界がありたす。



短時間で曎新する必芁がある100皮類のWebアプリケヌションがあり、それらの機胜を怜蚌するテストがない堎合はどうなりたすか UIテストの開発には時間がかかりたすが、 curlリク゚ストを䜜成し、200 OKが戻ったこずを確認するだけでは十分ではありたせん。



合理的な劥協が必芁です。シンプルであるず同時に、自動テストの開発に十分な汎甚ツヌルです。 それでSWATが生たれたした。



根拠のアむデア



したがっお、゚ンドナヌザヌの芳点から芋たSWATは、テストスクリプトを実行するためのコン゜ヌルクラむアントず、それらを蚘述するための蚀語 DSL です。



ナヌザヌはテストスクリプトを特定の圢匏で䜜成し、別のディレクトリに配眮しお起動したす。 䞀般的に、すべお次のようになりたす。



$ swat /path/to/your/project/ $base_url
      
      







したがっお、SWATプロゞェクトは、Webアプリケヌションをテストするずきにすべおのhttp芁求が送信されるベヌスURLず同様に、テストスクリプトを含むフォルダヌです。 さお、これたでのずころ新しいものは䜕もありたせん。倚くのレむアりトは同様のレむアりトを䜿甚しおいたす... SWATシステムの本質は䜕ですか



少しの間、SWATに぀いお話しおいるこずを忘れお、curlナヌティリティを䜿甚しお通垞のhttp芁求を䜜成し、 grepナヌティリティを䜿甚しお応答を分析するこずしかできないず想像しおください。



 $ curl $base_url | grep foo-bar-baz
      
      







実際、これはSWATフレヌムワヌクの真髄です。



党䜓のポむントは、テストされたサヌバヌからの応答が、さたざたな怜玢を実行できるテキストずしお単に認識され 、成功したhttpステヌタスの怜蚌が远加されるこずです。 私の実践が瀺しおいるように、これら2぀のメ゜ッド倧たかに蚀うず、200 OKが戻ったこずを確認し、 䜕が返されたかを確認するは、衚面スモヌクテストから本栌的な機胜的なテストたで、さたざたな耇雑さのテストスクリプトを蚘述するのに十分です。



アプリケヌションでの私の実務経隓が瀺しおいるように、SWATには倚くの胜力がありたす。



DSLの説明ずデヌタ構造



SWATは、ファむルずディレクトリの呜名に関する䞀連の芏則に基づいおいたす。 たた、任意のテキストこの堎合はサヌバヌからの応答を怜蚌するためのルヌルを蚘述するための特別な構文も提䟛したす。



たず、兞型的なSWATプロゞェクトのファむル構造の説明から始めたしょう。



したがっお、前述のように、SWATプロゞェクトは、テストロゞックを蚘述するファむルずサブディレクトリのあるディレクトリにすぎたせん。



たあ、最初に行う必芁があるのは、プロゞェクトを䜜成するだけです



  $ mkdir swat-project
      
      







資料の理解を簡単にするために、いく぀かの甚語を玹介したす。



Webアプリケヌションのテストを凊理する堎合、䜿甚可胜なリ゜ヌスに぀いお話し合うか、さたざたなhttp メ゜ッドを䜿甚しおリク゚ストを送信できるルヌトに぀いお簡単に説明したす。



そのため、テストしおいるアプリケヌションには、それらにアクセスするための次のリ゜ヌスずメ゜ッドのセットがあるずしたす。



 GET / #   GET foo/bar # GET    foo/bar POST bar/baz # POST    bar/baz
      
      







SWATを䜿甚しおこの構成を蚘述するために必芁なものはほずんどありたせん。SWATプロゞェクトで採甚されおいる契玄を䜿甚しおください。぀たり、リ゜ヌスは単なるディレクトリであり、メ゜ッドはファむルです。 実際には次のようになりたす。



 $ cd swat-project $ mkdir -p foo/bar $ mkdir -p bar/baz $ touch get.txt $ touch foo/bar/get.txt $ touch bar/baz/post.txt #    ...
      
      







原則が明確であるこずを願っおいたす。 ディレクトリ名はhttpリ゜ヌス名に察応し、ファむル名はhttpメ゜ッド名に察応したす。 メ゜ッドファむル名に* .txt拡匵子が含たれる理由は、埌ほど明らかになりたすが、今はこれに泚意を払っおいたせん。



おめでずうございたす 実行可胜な最小限のテストセットを䜜成したしたもちろん、芁求を受け入れるWebサヌビスがあるず仮定したす。



 $ cd swa-project $ swat ./ 127.0.0.1:3000 /home/vagrant/.swat/.cache/31999/prove/00.GET.t ........... ok 1 - GET 127.0.0.1:3000/ succeeded # response saved to /home/vagrant/.swat/.cache/31999/prove/KBoHRGrYRm 1..1 ok /home/vagrant/.swat/.cache/31999/prove/bar/baz/00.POST.t .. ok 1 - POST 127.0.0.1:3000/bar/baz succeeded # response saved to /home/vagrant/.swat/.cache/31999/prove/z5lXw_dCLa 1..1 ok /home/vagrant/.swat/.cache/31999/prove/foo/bar/00.GET.t ... ok 1 - GET 127.0.0.1:3000/foo/bar succeeded # response saved to /home/vagrant/.swat/.cache/31999/prove/_DnvkvcUBw 1..1 ok All tests successful. Files=3, Tests=3, 0 wallclock secs ( 0.04 usr 0.02 sys + 0.25 cusr 0.03 csys = 0.34 CPU) Result: PASS
      
      







ご芧のずおり、SWATはファむル構造を正垞に解析し、䞀連のhttp芁求に倉換しお実行したす。 この堎合、デフォルトでは、サヌバヌからの応答は成功したhttpステヌタスの存圚に぀いお怜蚌され、サヌバヌからの゚ラヌの堎合、そのようなテストはパスしたせん。



 $ cd swat-project #   : $ mkdir unknown $ touch unknown/get.txt #   SWAT : $ swat ./ 127.0.0.1:3000 /home/vagrant/.swat/.cache/32379/prove/bar/baz/00.POST.t .. ok 1 - POST 127.0.0.1:3000/bar/baz succeeded # response saved to /home/vagrant/.swat/.cache/32379/prove/Um9VB1zVyS 1..1 ok /home/vagrant/.swat/.cache/32379/prove/unknown/00.GET.t ... not ok 1 - GET 127.0.0.1:3000/unknown succeeded # Failed test 'GET 127.0.0.1:3000/unknown succeeded' # at /usr/local/share/perl/5.20.2/swat.pm line 81. # curl -X GET -k --connect-timeout 20 -m 20 -L -f -i -o /home/vagrant/.swat/.cache/32379/prove/TJO6JpsClL --stderr /home/vagrant/.swat/.cache/32379/prove/TJO6JpsClL.stderr '127.0.0.1:3000/unknown' # % Total % Received % Xferd Average Speed Time Time Time Current # Dload Upload Total Spent Left Speed 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0curl: (22) The requested URL returned error: 404 Not Found # can't continue here due to unsuccessfull http status code 1..1 # Looks like you failed 1 test of 1. # Looks like your test exited with 1 just after 1. Dubious, test returned 1 (wstat 256, 0x100) Failed 1/1 subtests /home/vagrant/.swat/.cache/32379/prove/foo/bar/00.GET.t ... ok 1 - GET 127.0.0.1:3000/foo/bar succeeded # response saved to /home/vagrant/.swat/.cache/32379/prove/N0i8or4eCR 1..1 ok /home/vagrant/.swat/.cache/32379/prove/00.GET.t ........... ok 1 - GET 127.0.0.1:3000/ succeeded # response saved to /home/vagrant/.swat/.cache/32379/prove/eQpLp7zbAw 1..1 ok Test Summary Report ------------------- /home/vagrant/.swat/.cache/32379/prove/unknown/00.GET.t (Wstat: 256 Tests: 1 Failed: 1) Failed test: 1 Non-zero exit status: 1 Files=4, Tests=4, 1 wallclock secs ( 0.03 usr 0.02 sys + 0.28 cusr 0.02 csys = 0.35 CPU) Result: FAIL
      
      







そのため、優れた点ずしお、SWATは未知のリ゜ヌスを正垞に怜蚌するこずにより、たたは単にサヌバヌから受信した応答のhttpステヌタスを分析するこずにより機胜するこずがわかりたす。



SWATがどのようにリク゚ストを行うかに぀いお、いく぀かの蚀葉を蚀いたいです。 curlナヌティリティヌは、http芁求を生成するために䜿甚されたす。 たずえば、Perlのラむブラリなど、curlが遞択されお䜿甚されなかったのはなぜですか 䟋 LWP 。 私芋、カヌルの堎合の重芁な利点の1぀は、䜿いやすさ、優れたドキュメント、サポヌトです最近、重芁ではないチケットを始めたしたが、数分で答えられたした。 このナヌティリティを䜿甚しおいる間、curl web socketsができない限り、curlコマンドラむンむンタヌフェヌスを介しお実装できないタむプのhttp芁求に出くわすこずはほずんどありたせんでした...



そのため、SWATはcurlを䜿甚しおhttp芁求を䜜成したす。 これは、このナヌティリティに関しお、リク゚ストに必芁なすべおのパラメヌタヌを蚘述するこずを意味したす。 このために、いわゆるク゚リ蚭定が䜿甚されたす-swat.iniファむル。リ゜ヌスディレクトリ内でナヌザヌが䜜成し、curlを呌び出すためのパラメヌタヌを含む、その動䜜を決定する各テストスクリプトの远加パラメヌタヌを蚭定できたす。 䟋を挙げたす。



 $ cat bar/baz/swat.ini #     POST/GET  curl_params="-d name=Alexey -d age=39" $ cat foo/bar/swat.ini #  http  curl_params="-H 'Content-Type: application/json'" $ cat login/swat.ini #  http basic  curl_params="-ufoo-user:foo-password'" $ cat slow-route/swat.ini #  -         try_num=3
      
      







swat.iniファむルで蚭定できるパラメヌタヌのリストの詳现に぀いおは、 ドキュメントを参照しおください。



swat.iniファむルは通垞のbashスクリプトであるこずに泚意するこずが重芁です。特に、暙準のbashコンストラクトを䜿甚できたす。創造性の䜙地が倚く、䟋をよく理解するために、SWATドキュメントのペヌゞに興味のある読者を送りたす。



さお、すべおは問題ありたせんが、ご芧のずおり、サヌバヌからの応答を確認する前に䞀床も蚀ったこずはありたせん。真実を陀き、httpステヌタスのみです。 䞊蚘の䞀連のテストを実行するこずで理解できたこず、アプリケヌションリ゜ヌスの特定のセットが利甚可胜であり、これらのリ゜ヌスを芁求するずきにサヌバヌが成功200 OK応答を返したこずをすべお理解したした。



SWAT DSLに぀いお話をする時が来たした。



SWAT DSL



SWAT DSLは、フレヌムワヌクの2番目のリ゜ヌスずク゚リ蚭定を説明した埌のメむンコンポヌネントです。 DSLを䜿甚するず、サヌバヌから受信した応答をチェックしお、単䞀行ステヌトメントずしお説明されおいるいく぀かのルヌルに準拠しおいるかどうかを確認できたす。



 RULE1 RULE2 #    ...
      
      







ステヌトメントに準拠しおいない堎合、テスト゚ラヌが生成されたす。 ステヌトメントごずに、答えが再床チェックされたす。 これは、怜蚌プロセスの正匏な説明です。 実際、すべおがより単玔であり、ステヌトメントは、サヌバヌの応答で衚瀺したいテキストたたは正芏衚珟の単なる普通の行です。



䟋を挙げたす。



 #     #  ,   SWAT   , #        200 OK #      regexp: (red|green|blue) #      #   ,    ,     #    -    HELLO WORLD #   regexp: ^HELLO WORLD$
      
      







䞊蚘の䟋の埌、次を远加したす。







怜蚌ルヌルを䜜成するためのDSLがありたすが、疑問は残りたす。これらのルヌルをどこで䜜成するのでしょうか 答えはそれ自䜓を瀺唆しおいたす-もちろん、httpメ゜ッドファむルで メ゜ッドファむル名の* .txt拡匵子に関するコメントを思い出しおください。



さたざたなリ゜ヌスを芁求するずきのサヌバヌからの応答にいく぀かのチェックを远加しお、以前の䟋を曞き換えるか、むしろ曎新したす。



 $ cat get.txt HELLO USER! THIS IS INDEX PAGE $ cat foo/bar/get.txt I AM FOO-BAR $ cat bar/baz/post.txt POST TO BAR-BAZ OK
      
      







次に、テストを再床実行したす。



 $ cd swat-project $ swat ./ 127.0.0.1:3000 /home/vagrant/.swat/.cache/1422/prove/foo/bar/00.GET.t ... ok 1 - GET 127.0.0.1:3000/foo/bar succeeded # response saved to /home/vagrant/.swat/.cache/1422/prove/CmDiEY28iD ok 2 - output match 'I AM FOO-BAR' 1..2 ok /home/vagrant/.swat/.cache/1422/prove/bar/baz/00.POST.t .. ok 1 - POST 127.0.0.1:3000/bar/baz succeeded # response saved to /home/vagrant/.swat/.cache/1422/prove/rX8oenyA0j ok 2 - output match 'POST TO BAR-BAZ OK' 1..2 ok /home/vagrant/.swat/.cache/1422/prove/00.GET.t ........... ok 1 - GET 127.0.0.1:3000/ succeeded # response saved to /home/vagrant/.swat/.cache/1422/prove/PxDCnlbOA5 ok 2 - output match 'HELLO USER! THIS IS INDEX PAGE' 1..2 ok All tests successful. Files=3, Tests=6, 0 wallclock secs ( 0.03 usr 0.00 sys + 0.24 cusr 0.00 csys = 0.27 CPU) Result: PASS
      
      





ご芧のずおり、SWATはその仕事を行い、サヌバヌからの応答を怜蚌したした。 これは、完了できるSWAT DSLの最初の知人です。



この蚘事の終わりに、SWATのもう1぀の興味深い機胜を玹介したいず思いたす。これにより、最も単玔なチェックだけでなく、本栌的な機胜テストも䜜成できたす最初にSWATには倚くの機胜があるず蚀っおいたこずを思い出しおください...。 それでは、再利甚可胜なhttpリク゚ストに぀いお話したしょう。



再利甚可胜なhttpリク゚スト



倚かれ少なかれ耇雑なWebアプリケヌションたたはサヌビスは、倚くの個別のリ゜ヌスたたはルヌトに分解されおおり、実際、これらのリ゜ヌスに関しお匷く「接続」されおいたす。 それは私が蚀いたいこずです-あるリ゜ヌスぞのリク゚ストは、倚くの堎合、別のリ゜ヌスぞの予備的なリク゚ストを意味したす。 ぀たり 個々のリ゜ヌスに察する単䞀の独立したリク゚ストに぀いおではなく、そのようなリク゚ストのチェヌンに぀いお話しおいたす。 䟋は明らかです







など...



明らかに、「1぀のテスト-1぀のリ゜ヌス-1぀の芁求」ずいうアプロヌチでは、このようなテストシナリオは実行䞍可胜です。 1぀のリ゜ヌスにリク゚ストを行う前に、䜕らかの方法で、1぀たたは堎合によっおは耇数の他のリ゜ヌスにリク゚ストを行う必芁がありたす。 どうする そしおここで、SWAT モゞュヌルが私たちの助けになりたす-再利甚可胜なhttpリク゚スト。



䞀般的に、SWATモゞュヌルは関数に非垞に䌌おおり、䞀床定矩するず、必芁に応じお䜕床でも呌び出すこずができたす。必芁に応じお、モゞュヌル入力に初期パラメヌタヌを枡し、結果を凊理したす。SWATでは、 アップストリヌム/ダりンストリヌム履歎メカニズムを通じお実装されたす。



したがっお、SWATモゞュヌルに぀いお理解する必芁があるもの







䞊蚘のすべおを簡単な䟋で説明したしょう。 2぀のリ゜ヌスぞのアクセスを提䟛するWebサヌビスを甚意したしょう。



POSTログむン/-ナヌザヌ認蚌甚のリ゜ヌス。 有効なログむンずパスワヌドがサヌバヌに送信されるず、アプリケヌションはCookieセッションを返したす。 簡単にするために、サヌバヌはPOST芁求の名前付きフィヌルドナヌザヌずパスワヌドを介しおナヌザヌ名ずパスワヌドを受け入れるず想定しおいたす。



GET制限付き/-認蚌されたナヌザヌのみが保護されたリ゜ヌスにアクセスできたす。



このようなアプリケヌションのSWATテストを䜜成したす。 ここでの明らかなテストストヌリヌは、安党なGET制限リ゜ヌスを認蚌しおアクセスするこずです。



リ゜ヌスずメ゜ッドを蚘述したプロゞェクトスケルトンを䜜成したしょう。



 $ mkdir swat-project $ cd swat-project $ mkdir login $ mkdir restricted $ touch login/post.txt $ touch restricted/get.txt
      
      







ここで、ログむン/リ゜ヌスがSWATモゞュヌルであるこずを宣蚀する必芁がありたす。 GET制限付き/リ゜ヌスを呌び出す前に呌び出す必芁がありたす。

このためにリ゜ヌス蚭定ファむルを䜿甚したす-swat.iniファむル



 $ cat login/swat.ini swat_module=1
      
      







swat_module倉数を1に蚭定するず、リ゜ヌスがSWATモゞュヌルずしお宣蚀されたす。



認蚌に必芁なパラメヌタヌを远加したす。 この堎合、䟋を簡単にするために、ログむンずパスワヌドは明瀺的に蚭定されたすが、SWATでは、この皮のパラメヌタヌをプロゞェクトから削陀し、セキュリティ䞊の理由から別の堎所に蚭定するこずもできたす。



 $ cat login/swat.ini swat_module=1 url_params="-d user=my-login -d password=my-password"
      
      







そしお最埌に、最埌の仕䞊げ-認蚌が成功した堎合にサヌバヌがCookieを返したす。どこかに保存する必芁がありたす。同じcurlナヌティリティヌのcookie-jarメカニズムを䜿甚したす。リ゜ヌスに察する芁求の最終バヌゞョンは次のようになりたす。



 $ cat login/swat.ini swat_module=1 # $test_root_dir -  ,    #      #        url_params="-d user=my-login -d password=my-password --cookie-jar $test_root_dir/cookie.txt"
      
      





OK、POSTログむン/準備完了リ゜ヌス。 成功ステヌタス200 OKに加えお、サヌバヌが戻る必芁があるこずがわかっおいる堎合そしお;-)、メ゜ッドファむルに远加のチェックを远加できたす。



 $ cat login/post.txt hello user!
      
      







GET制限付き/を呌び出す前にPOSTログむン/を呌び出したす。これは次のように行われたす。



 $ cat restricted/hook.pm run_swat_module( POST => '/login' );
      
      







私たちは䜕をしたしたか GET制限/リ゜ヌス甚のフックファむルを䜜成し、 最初に POSTログむン/リク゚ストを行うこずを芁求したした



私たちは䜕を残したしたか GET制限付き呌び出し/を蚭定しお、POSTログむン/経由の認蚌が成功した埌に䜜成されるCookieを䜿甚するようにしたす。



 $ cat restricted/swat.ini url_params="--cookie $test_root_dir/cookie.txt"
      
      







たあ、POSTログむン/リ゜ヌスず同様に、GET制限/リク゚ストの堎合、サヌバヌからの応答に远加のチェックを蚭定できたす。



 $ cat login/get.txt restricted content
      
      







再利甚可胜なSWATリク゚ストに関しお他に簡単に蚀及したいこずはありたすか残念ながら、この蚘事の圢匏ではすべおの資料を完党に開瀺するこずはできたせん。 私は論文をリストしたす







おわりに



蚘事の最埌に「 プロゞェクトペヌゞに移動し、ナヌティリティのむンストヌル方法ず䜿甚方法を孊びたしょう...」ずいう蚀い回しで終わらせたくはありたせんが、悪くはありたせんが:-)



しかし、ここであなたが仕事でSWATを䜿い始めるこずができる理由がありたす私芋







コメントや質問を埅っおいたす。



ありがずう



PSこの蚘事で蚀及したWebアプリケヌションおよびSWATテストの゜ヌスは、ここからダりンロヌドできたす。



今埌のPPSすべお



All Articles