python seleniumによる自動化functional test

9564 ワード

Why Automation Testing
機能の正常な動作を保証するために、1つのプロジェクトに十分なテストがあるべきであることを認めているようです.そして、ここでの「テスト」は特に自動化テストを指しています.また、コードの正確性を保証するために人工テストを採用しているプロジェクトがあるとすれば、それはあまりにも遅れていると考えている人が多く、不思議です.
しかし、私の今のプロジェクトでは、以前のほとんどの場合、私たちは手動テストを使用していました.プロジェクトは毎週1回整然とオンラインになっています.もちろん、一部の原因はプロジェクト業務と技術上の特殊性のためですが、私たちはなぜ自動化を行うのかを考え始めました.どのような状況で自動化を行うべきですか?自動化テストはすべてのテストシーンと使用しますか?
自動化テストが私たちのプロジェクトにとって重要なのは、いくつかの理由があると思います.
Automated Software Testing Saves Time
私たちのプロジェクトは現在、週に1回の頻度でオンラインになっています.プロジェクト自体の特殊性のため、オンラインになるたびに大規模な手動テストを行い、breakの既存の機能がないことを保証します.このようなテストは週に1回繰り返され、テストの内容も変化せず、チームメンバーの大部分の時間と精力を消費しています.したがって、自動化テストを導入すると、自動化テストを実行してこれらの重複作業を完了することができ、時間と不要な労働を節約することができます.
Team Morale Improves
テストがなければ、私たちは自分のコードに自信がないわけではありません.しかし、どんなにすごいプログラマーでも、自分のコードが100%間違いなく動作することを保証することはできません.特に、これらのコードが既存のプロジェクトと結合して動作する必要がある場合です.私たちのコードが他のプロジェクトと結合すると、私たちのコードが単独で動作するのではないかと心配することがありますが、統合後に既存の機能を破壊します.特に、このような状況が実際に発生した後、このような心配はさらに拡大されます.自動化されたテストは、コードが期待通りに動作することをある程度保証し、開発者のコードに対する自信を強化します.そして、この自信はプログラマーが自分のコードを鑑賞することではなく、自分のコードが本当に検査を受けて正常に動作することができるからです.また、このような自信は、自動化テストがもたらす3つ目のメリットからも来ています.
Increase Test Coverage
自動化されたテストがより多くの人工テストにカバーされるため、カバーするテストの範囲と深さに多くの時間を費やす必要があります.私たちのコードはある程度試練に耐えられていることを知ることができて、自分のコードに対してより自信を持って後続の統合と開発を続けることができます.
Selenium + Python
Seleniumはブラウザを自動化するツールで、Webアプリケーションの自動化テストによく使われています.他のテストツールと比較して、主なメリットは次のとおりです.
Seleniumテストは、実際のユーザーが行ったようにブラウザで直接実行されます.
Selenium webdriverは、さまざまなオペレーティングシステムの多くのブラウザプラットフォームで実行できます.
Google Chrome 12.0.712.0+
Internet Explorer 6, 7, 8, 9 - 32 and 64-bit where applicable
Firefox 3.0, 3.5, 3.6, 4.0, 5.0, 6, 7
Opera 11.5+
HtmlUnit 2.9
Android – 2.3+ for phones and tablets (devices & emulators)
iOS 3+ for phones (devices & emulators) and 3.2+ for tablets (devices & emulators)
また、seleniumはJava、Javascript、Ruby、PHP、Python、Perl、C#など、さまざまなプログラミング言語のサポートを提供しています.
こんなに多くの言語サポートの中で、なぜpythonを選んだのでしょうか.
まず、pythonは非常に簡単に入門できるオブジェクト向けのスクリプト言語です.私はpython+seleniumを書く前にpythonのプログラミング経験は全くありませんでしたが、文法がかなり簡単で、意味が英語に近いので、簡単に勉強してからすぐに上手になります.
また、スクリプト言語としてjavaに比べて、解釈実行という生まれつきのメリットがあります.これは、Javaのように長いコンパイルパッケージなどのプロセスではなく、1行のコマンドで結果を見ることができるコードを何行か書いたことを意味します.同じ機能を完了するには、pythonにはpyファイルとコマンドが1行しか必要ありませんが、javaにはプロジェクト全体が必要で、パッケージパブリケーションなどがコンパイルされます.mavenを使用しても、関連する構成が多く、プロセスがかなり面倒です.
pythonとseleniumを組み合わせてfunctional testを書く場合は、マシン上でpythonの環境を構成し、selenium(easy_install selenium)をダウンロードし、テストコードを作成し、簡単なコマンド:python xxx.pyはテストコードを実行できます.
How to Write Test Code
まず、selenium webdriverの依存性をテストコードに追加する必要があります.
from selenium import webdriver

Webdriverコンポーネントには、すべてのWebDriverの実装が含まれており、selenium webdriverが提供するブラウザインタラクションなどの強力な機能を使用することができます.
driver = web driver.Firefox()
driver.get("http://www.google.com")

Firefox WebDriverのインスタンスを作成します.driver.getメソッドは、メソッドパラメータに与えられたURLが指すページを開きます.この行のコードは、ターゲットページが完全にロードされるまで制御を後続のコードに返します.
私たちが開きたいページを手に入れたら、ページについて基礎的な判断をすることができます.
assert "Google" in driver.title

この断言は、ページのhtmlタグに「Google」という文字列が含まれているかどうかを判断します.このような断言はよくありますが、開いているページが私たちが期待しているページかどうかを判断するのに役立ちます.<br>その後、ターゲットページでは、各ページ要素にさらにナビゲートし、これらの要素とインタラクティブにユーザー操作を模倣し、要素の動作が予想通りに一致するかどうかをテストすることができます.<pre><code>searchInput = driver.find_element_by_id(<span style="color: #800000;">"</span><span style="color: #800000;">lst-ib</span><span style="color: #800000;">"</span><span style="color: #000000;">) searchInput.send_keys(</span><span style="color: #800000;">"</span><span style="color: #800000;">selenium</span><span style="color: #800000;">"</span><span style="color: #000000;">) searchBtn </span>= driver.find_element_by_name(<span style="color: #800000;">"</span><span style="color: #800000;">btnK</span><span style="color: #800000;">"</span><span style="color: #000000;">) searchBtn.click()</span></code></pre> <br>WebDriverは、要素への配置方法をいくつか提供します.<br>find_element_by_id <br>  <br>find_element_by_name <br>find_elements_by_name <br>find_element_by_class_name <br>find_elements_by_class_name <br>find_element_by_tag_name <br>find_elements_by_tag_name <br>find_element_by_xpath <br>find_elements_by_xpath <br>find_element_by_link_text <br>find_elements_by_link_text <br>find_element_by_partial_link_text <br>find_elements_by_partial_link_text <br>find_element_by_css_selector <br>find_elements_by_css_selector <br>  <br>click()とsend_keys()はseleniumです.webdriver.common.action_chains.ActionChainsで提供される要素と対話する方法.click()は要素のクリックをシミュレートし、send_keys()は、1つの要素にキーボード入力を入力することをシミュレートします.他のインタラクションメソッドでは、APIを表示できます.<br>最後に、ページ操作が完了したらdriverを使用できます.close()またはdriver.quit()で終了します.この2つの違いは、closeはtabを1つだけ閉じ、quitはブラウザ全体を閉じることです.<br>A Simple Demo <br>上のコードは厳密には私たちがよく書くテストコードではありません.それはウェブページを開いて簡単な操作をしただけです.pythonが提供する標準unittestライブラリを使用して、テストコードのスタイルに合うように書くことができます.unittestライブラリを使用すると、terminalでテストレポートが表示されます.<pre><code><span style="color: #0000ff;">import</span><span style="color: #000000;"> unittest </span><span style="color: #0000ff;">from</span> selenium <span style="color: #0000ff;">import</span><span style="color: #000000;"> webdriver<br/><br/></span><span style="color: #0000ff;">class</span><span style="color: #000000;"> GooglePageTest(unittest.TestCase): </span><span style="color: #0000ff;">def</span><span style="color: #000000;"> setUp(self): self.driver </span>=<span style="color: #000000;"> webdriver.Firefox() </span><span style="color: #0000ff;">def</span><span style="color: #000000;"> test_click_all_links_on_page(self): driver </span>=<span style="color: #000000;"> self.driver driver.get(</span><span style="color: #800000;">"</span><span style="color: #800000;">http://www.google.com</span><span style="color: #800000;">"</span><span style="color: #000000;">) length </span>= len(driver.find_elements_by_tag_name(<span style="color: #800000;">"</span><span style="color: #800000;">a</span><span style="color: #800000;">"</span><span style="color: #000000;">)) </span><span style="color: #0000ff;">for</span> i <span style="color: #0000ff;">in</span><span style="color: #000000;"> range(0,length): links </span>= driver.find_elements_by_tag_name(<span style="color: #800000;">"</span><span style="color: #800000;">a</span><span style="color: #800000;">"</span><span style="color: #000000;">) </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> links[i].is_displayed(): links[i].click() driver.back() self.assertIn(</span><span style="color: #800000;">"</span><span style="color: #800000;">Google</span><span style="color: #800000;">"</span> <span style="color: #0000ff;">or</span> <span style="color: #800000;">"</span><span style="color: #800000;">YouTube</span><span style="color: #800000;">"</span><span style="color: #000000;">,driver.title) </span><span style="color: #0000ff;">def</span><span style="color: #000000;"> tearDown(self): self.driver.close() </span><span style="color: #0000ff;">if</span> <span style="color: #800080;">__name__</span> == <span style="color: #800000;">"</span><span style="color: #800000;">__main__</span><span style="color: #800000;">"</span><span style="color: #000000;">: unittest.main()</span></code></pre> <br>このコードはまずunittestコンポーネントを導入し、私たちがよく知っているtest caseのスタイルを使ってテスト例を書いて、Googleのホームページの上のすべての<a>ラベルのクリックをテストして、開いているページごとにtitleに期待するキーワードが含まれているかどうかをチェックしました.テストが終了するとブラウザが自動的に閉じ、terminalでテストレポートが表示されます.