ClojureがSeleniumテストの作成を高速化する方法

画像 読者の皆さん、こんにちは! いくつかの入力フィールドと1つのボタンよりも少し複雑なSelenuimテストを書くことができたなら、この記事が役に立つかもしれません。







数分テストケースを実行することを突然拒否し、複雑なシングルページアプリケーションで壊れたcssまたはxpathセレクターを見つけて、ログ出力を待つために何度も何度もこのスクリプトを繰り返し実行することを強いられたコンソールに。 Seleniumテストを快適に作成できることがわかりました!







記事は何ですか-言い換えれば、初心者向け

セレンについて。 かつてはFireFoxの単なるプラグインでした。 「記録」ボタンを押すと、テストされたサイトのインターフェース(フォーム、リンク)のプルを開始します。 プログラミングの知識がほとんどまたはまったくなくても、必要な検証値を代入することで、結果のスクリプトを編集できます。 それだけです-テストの準備ができました! 展開後に毎回実行し、肘で移動したものを確認します。 次に、Seleniumはさまざまな言語のAPIを追加しました。 特に、JAVA用があります。 APIを使用して、同じことを実行できます。目的のサイトでブラウザーを起動し、フォームで送信された値を確認し、リンクをたどるなど。 問題は、スクリプトの実行が遅いことです。 テストをテストするには、スクリプトを再起動する必要があり、これは均一な拷問です。 Clojure(JAVAの上部)を使用すると、エディターでREPLを介して実行中のプログラムのコードを実行できます。







Seleniumテストを使用したプロジェクトの分析



このプロジェクトはGitHub利用できます 。機能:









プロジェクトの依存関係では、ライブラリ-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方言の構文を見て、必然を受け入れる最初の段階を経ているはずです。 あなたがそれを渡すかどうかはあなた次第です、私は経験に基づいていくつかのアドバイスを与えることができるだけです。









インデントに応じてParinferが括弧を閉じるのにどのように役立つか






開発ツールのクイックスタート



60年代のアメリカで若者をヒッピーとして過ごしたなら、自由、民主主義、ソフトドラッグの精神を味わうことができました。 起こらなかったとしても大丈夫です。REPLClojureを使用してこの精神を感じることができます。

REPL Clojure-セレンテストの記述を完全に異なるレベルにします! この他のREPLの主要な機能は、既に実行中のアプリケーションで、その状態を失うことなくコードを記述できることです。 このツールを使用すると、作業中のcssまたはxpathセレクターをコンパイルできるだけでなく、任意の順序でテストを実行し、複雑なシングルページアプリケーションの状態を失うことなく、大規模なテストケースのノードの動作をチェックできます。







AtomエディターのREPL機能のデモンストレーション








LightTableエディターでREPLを使用して行ごとにプロジェクトコードを実行する







Clojureのコードエディター -ほとんどすべての人気のあるエディターとIDEにはClojureをサポートするためのプラグインがあり、 IntelliJ IDEA + Cursiveのエントリしきい値が最も低いと決めました。 CursiveでのREPLのセットアップと使用に関する小さなチュートリアル







また人気:









Leiningenは、Node.jsの世界のnpmのような依存関係マネージャーです。 依存関係として、LeiningenはClojureインタープリター自体も提示するという違いがあります。 したがって、 Leiningenインストールするだけで十分です。彼はClojureを自分でダウンロードします。







図書館について

メインのClojureリポジトリーでは、mavenリポジトリー(Javaコミュニティーの無数の富)のライブラリーを使用することもできます。 便利なライブラリの選択







その後、コンソールに入力して新しい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を正常に使用できる場合があります。 これにより、新しいスペシャリストをテストの作成とサポートに迅速につなぐ良い機会が開かれます。







便利なリンク





Slackチャットの記事に対する批判#clojure-russia

やしゃか

私は、テストロジックのトラップケッチの背後に弱く跳ね返ることができないという疑いを持っています... if、ループ、トラップケッチなどの複雑な構造は、テストを書く際に悪い形と見なされます







この例では、これは本質的にロギング機能であり、そのようなものは通常何らかの抽象化にレンダリングされます...







たぶん、便利さを見せたいという願望があるなら、toliがdeftestの周りの追加マクロを機能させるかどうかのある種のログコードを取得する方法を示す価値がある







セリー

まあユニットテストとセレンテスト、異なること。 実際には、セレンを試してみると非常に便利です。 ほとんどのテストの失敗は、古いセレクター(編集済み)、または予測が困難な突然のゴミによっても発生するため







やしゃか

「複雑な構造を使用しない」という論理は、多くのテストがあり、変更することができ、多くの人々がそれらを書くという事実から発展します-したがって、フローについて考える時間はありません-テストは文字通り明白であるべきです







少なくとも私が理解している限り:)







セレンのテストでは-テストはそれ自体でより複雑なので、これはさらに重要です...







セリー

はい、大きな改善の余地があります)手がまだ届いていません







やしゃか







または予測が困難な突然のでたらめ

突然のでたらめ-これはいずれにしても

飛行飛行-これはレポート付きの落下試験です







セレンの組み込みの実行-少し情報







それが人々がセレンの周りにラッパーを書く理由です







論理テストが単純で明白なままであるかのように...







セリー

私はあなたがdsl simpleを書くことができるという結論の記事に注意しました







そして例では、細かく刻まれた工芸品







やしゃか

私は開発者ではなく、自分自身がオートメーションエンジニアであり、このテーマについてチャットルームで時間を過ごしています。

そこに、新人がイファミとトレイ・ケッチーとのテストを示すとすぐに、道徳的な山がすぐに注ぎます...

ここで重要なのは、良いことと悪いことではありません...

しかし実際には、非公式の言語に関しては大きなメッセージがあり、人々は批判を注ぎ始めるでしょう:)

そして、「ひざまずきの偽物」で彼らに与える理由は、







私は今閉塞しているので、残念ながら助ける時間はありません...しかし、急いでいないなら、1、2週間のうちのどこかに、この記事をコピーすることができます...







motor4ik

そして最も重要なケースは記事で考慮されていませんか? テストが失敗し、リプレイで修正する方法は?







私が理解しているように、それはキラー記事でしたか?







セリー

月曜日は公開が予定されています。 一般的に、それが離陸する場合は、2番目の記事を提出することもできます







そして、テスト用のDSLをガッシュ= P







そして、今では小さな例ですが、初心者には非常に理解しやすいです







PS私はインスピレーションと編集者としてのみ行動し、記事の著者はセリーです。








All Articles