読者の皆さん、こんにちは! いくつかの入力フィールドと1つのボタンよりも少し複雑なSelenuimテストを書くことができたなら、この記事が役に立つかもしれません。
数分テストケースを実行することを突然拒否し、複雑なシングルページアプリケーションで壊れたcssまたはxpathセレクターを見つけて、ログ出力を待つために何度も何度もこのスクリプトを繰り返し実行することを強いられたコンソールに。 Seleniumテストを快適に作成できることがわかりました!
セレンについて。 かつてはFireFoxの単なるプラグインでした。 「記録」ボタンを押すと、テストされたサイトのインターフェース(フォーム、リンク)のプルを開始します。 プログラミングの知識がほとんどまたはまったくなくても、必要な検証値を代入することで、結果のスクリプトを編集できます。 それだけです-テストの準備ができました! 展開後に毎回実行し、肘で移動したものを確認します。 次に、Seleniumはさまざまな言語のAPIを追加しました。 特に、JAVA用があります。 APIを使用して、同じことを実行できます。目的のサイトでブラウザーを起動し、フォームで送信された値を確認し、リンクをたどるなど。 問題は、スクリプトの実行が遅いことです。 テストをテストするには、スクリプトを再起動する必要があり、これは均一な拷問です。 Clojure(JAVAの上部)を使用すると、エディターでREPLを介して実行中のプログラムのコードを実行できます。
Seleniumテストを使用したプロジェクトの分析
このプロジェクトはGitHubで利用できます 。機能:
- クロスプラットフォーム-Windowsでプロファイル+ウィンドウを使用してテストを作成し、* nixでjarファイルを収集して、サーバーにアップロードできます。
- セレンとファントムの2つのWebドライバーですぐに動作します。Seleniumでテストを視覚的にデバッグし、Phantomで動作するjarをコンパイルして、CIスクリプトがプルするLinuxサーバーにアップロードする必要がある場合に便利です。
プロジェクトの依存関係では、ライブラリ-clj-webdriverを見ることができます。これは、Webドライバーを操作するためのメインツールであり、そのドキュメントです。
簡単なテスト例-selenium-project.tests.gosuslugi-mainを分析しましょう:
(deftest gosuslugi-main-search-form (profile/open-browser "https://www.gosuslugi.ru/") (try (->> ($ ".index-slider-search input") (type-text "") (->>keys Keys/ARROW_DOWN) (->>keys Keys/ARROW_DOWN) (->>keys Keys/ENTER)) (when-not ($ ".title_search") (throw (Exception. "redirect to search result, error"))) (swap! profile/tests-success inc) (is true) (log/info "gosuslugi-main-search-form -> ok") (catch Exception e (log/info "gosuslugi-main-search-form -> fail" (.getMessage e)) (swap! profile/tests-fail inc) (is false))))
(deftest gosuslugi-main-search-form ...)
deftest
- clojure.test
ライブラリからインポートされたマクロ。 これは、テストを記述するためのClojure組み込みライブラリです。 テスト用の標準機能があります。 deftest
マクロは単に関数を作成します。
テスト自体は、 Exception
を呼び出すことでフォームの実行を中断するため(または要素が見つからない場合など(try ... catch)
、便宜上、テストの失敗を処理するcatch
でフォームを実行するために(try ... catch)
ラップされています。
(->> ($ ".index-slider-search input") ...)
->>
-より読みやすい「裏返し」コードを記述するための標準的なClojureマクロ。 これがないと、スクリプトは次のようになります。
(->>keys Keys/ENTER (->>keys Keys/ARROW_DOWN (->>keys Keys/ARROW_DOWN (type-text "" ($ ".index-slider-search input")))))
マクロ->>
はフォームのリストを取得して展開し、最後の引数として実行結果を連続して次のフォームに渡します。 マクロ->>
を使用するために、単純な規則に従ういくつかのラッパー関数を作成しました。これらは、最後の引数として要素オブジェクトを受け入れ、それを返します。
(swap! profile/tests-success inc)
および(swap! profile/tests-fail inc)
は、成功したテストと失敗したテストの単純なカウンターです。
なぜClojure
簡単な答えは、複雑さに対する抽象化のレベルです。 すでにWikipediaに行って 、このLisp方言の構文を見て、必然を受け入れる最初の段階を経ているはずです。 あなたがそれを渡すかどうかはあなた次第です、私は経験に基づいていくつかのアドバイスを与えることができるだけです。
- Clojureは学習が容易な言語であり、入学のしきい値が高いほど、学校から頭に追い込む命令型アプローチとの違いに関連しています。 意識の硬直性を列挙すると、Clojureがアプリケーション開発を簡素化する便利なツールに変わっていることがわかります。
- このように豊富な括弧で混乱しないようにするにはどうすればよいですか? ブラケットには特別な問題はありません;ブラケットの目的を理解した日には、ブラケットに慣れます。 また、Clojure開発者のインキュベーション期間を促進する多くの優れたツールがエディターに登場しました。 まず、ほとんどの編集者は美しいParinferを利用できます。 そして、第二に、エディター設定にレインボーブラケットを平凡に含めることです。
- テストを記述するためにClojureの完全な知識は必要ありません。 トランスデューサー、レデューサー、およびその他の濁度 -この研究は後日まで延期できます。 開始するには、数晩でベースを習得するだけで十分です。

開発ツールのクイックスタート
60年代のアメリカで若者をヒッピーとして過ごしたなら、自由、民主主義、ソフトドラッグの精神を味わうことができました。 起こらなかったとしても大丈夫です。REPLClojureを使用してこの精神を感じることができます。
REPL Clojure-セレンテストの記述を完全に異なるレベルにします! この他のREPLの主要な機能は、既に実行中のアプリケーションで、その状態を失うことなくコードを記述できることです。 このツールを使用すると、作業中のcssまたはxpathセレクターをコンパイルできるだけでなく、任意の順序でテストを実行し、複雑なシングルページアプリケーションの状態を失うことなく、大規模なテストケースのノードの動作をチェックできます。

LightTableエディターでREPLを使用して行ごとにプロジェクトコードを実行する
Clojureのコードエディター -ほとんどすべての人気のあるエディターとIDEにはClojureをサポートするためのプラグインがあり、 IntelliJ IDEA + Cursiveのエントリしきい値が最も低いと決めました。 CursiveでのREPLのセットアップと使用に関する小さなチュートリアル 。
また人気:
- Emacs + Cider ( Spacemacs )
- Atom + Proto REPL
- ライトテーブル
Leiningenは、Node.jsの世界のnpmのような依存関係マネージャーです。 依存関係として、LeiningenはClojureインタープリター自体も提示するという違いがあります。 したがって、 Leiningenをインストールするだけで十分です。彼はClojureを自分でダウンロードします。
その後、コンソールに入力して新しいClojureプロジェクトを作成できます。
lein new app example-selenium-project
Leiningenは、プロジェクトツリー全体と構成ファイル-project.clj(npmではその類似物はpackage.json)を作成します。
プロファイルの処理もLeiningenに非常によく実装されています。project.cljファイルの:profiles
セクションで多くのプロファイルを定義することにより、開発環境または本番環境だけでなく、プログラムの作業を非常に柔軟に分離できます。
次のように、任意の数のプロファイルでアプリケーションを実行できます。
lein with-profile +windows,+selenium run
または、目的のプロファイルでjarをコンパイルします。
lein with-profile +windows,+phantom uberjar
おわりに
Clojureは、Seleniumテストを作成するための最も便利なツールであることを提案したいと思います。 2つの要因のおかげです。インタラクティブREPLと、独自の簡潔なDSLサブプロジェクトを作成できるマクロです。 実践が示すように、Clojure言語自体を知らず、ファサードでDSLを正常に使用できる場合があります。 これにより、新しいスペシャリストをテストの作成とサポートに迅速につなぐ良い機会が開かれます。
便利なリンク
- Clojureのビデオコース 。
- Slackチャット -招待はここから入手でき、#clojure-russiaチャンネルに接続できます!
- WebMeetups> clojure-russia-パーティーのビデオ録画。
やしゃか
私は、テストロジックのトラップケッチの背後に弱く跳ね返ることができないという疑いを持っています... if、ループ、トラップケッチなどの複雑な構造は、テストを書く際に悪い形と見なされます
この例では、これは本質的にロギング機能であり、そのようなものは通常何らかの抽象化にレンダリングされます...
たぶん、便利さを見せたいという願望があるなら、toliがdeftestの周りの追加マクロを機能させるかどうかのある種のログコードを取得する方法を示す価値がある
セリー
まあユニットテストとセレンテスト、異なること。 実際には、セレンを試してみると非常に便利です。 ほとんどのテストの失敗は、古いセレクター(編集済み)、または予測が困難な突然のゴミによっても発生するため
やしゃか
「複雑な構造を使用しない」という論理は、多くのテストがあり、変更することができ、多くの人々がそれらを書くという事実から発展します-したがって、フローについて考える時間はありません-テストは文字通り明白であるべきです
少なくとも私が理解している限り:)
セレンのテストでは-テストはそれ自体でより複雑なので、これはさらに重要です...
セリー
はい、大きな改善の余地があります)手がまだ届いていません
やしゃか
または予測が困難な突然のでたらめ
突然のでたらめ-これはいずれにしても
飛行飛行-これはレポート付きの落下試験です
セレンの組み込みの実行-少し情報
それが人々がセレンの周りにラッパーを書く理由です
論理テストが単純で明白なままであるかのように...
セリー
私はあなたがdsl simpleを書くことができるという結論の記事に注意しました
そして例では、細かく刻まれた工芸品
やしゃか
私は開発者ではなく、自分自身がオートメーションエンジニアであり、このテーマについてチャットルームで時間を過ごしています。
そこに、新人がイファミとトレイ・ケッチーとのテストを示すとすぐに、道徳的な山がすぐに注ぎます...
ここで重要なのは、良いことと悪いことではありません...
しかし実際には、非公式の言語に関しては大きなメッセージがあり、人々は批判を注ぎ始めるでしょう:)
そして、「ひざまずきの偽物」で彼らに与える理由は、
私は今閉塞しているので、残念ながら助ける時間はありません...しかし、急いでいないなら、1、2週間のうちのどこかに、この記事をコピーすることができます...
motor4ik
そして最も重要なケースは記事で考慮されていませんか? テストが失敗し、リプレイで修正する方法は?
私が理解しているように、それはキラー記事でしたか?
セリー
月曜日は公開が予定されています。 一般的に、それが離陸する場合は、2番目の記事を提出することもできます
そして、テスト用のDSLをガッシュ= P
そして、今では小さな例ですが、初心者には非常に理解しやすいです
PS私はインスピレーションと編集者としてのみ行動し、記事の著者はセリーです。