
少し前、Habréの記事「Autotests-noble dede 」が公開されました 。 2人以上の開発者が1つのプロジェクトに取り組んでいるチームでは、これは単に必要なことだと思います。 私が一人で働いたとき、私はテストなしでやった。 プロジェクトはゼロから作成されたため、手の甲のようなコードを知っていました。 会社は非常に急速に成長しました-その場所とタスクの数。 新しい開発者が登場し、問題が始まりました。 1つの機能を記述します-別の機能は落ちます。 考えないでください、これはめったに起こりませんが、そのようなエラーは高価であり、それを処理する必要がありました。 この時点で、開発プロセスに自動テストを導入することにしましたが、後悔することはありません。
そこで、テストプロセスをさらに最適化することにしました。 アイデアは、乙女、製品に機能を上げるときに自動的にテストを実行することです。 このアプローチの利点は明らかであり、すでに何度も書かれています。 最低限-これはテストがうまくいき、製品に注いだときに何も壊れないという私の自信です。
問題の解決策 :
VPSを簡単に拡張/複製できるクラウド(DigitalOcean)を選択しました。 2つのフローでテストを開始します。 これらの目的のために、サーバーを選択しました-2GBのRAM、それぞれ2.40GHzの2つのコアを備えています。 余裕を持って動作するはずです。そうでない場合、テストが不足しているためにテストが失敗するため 、Swapも1ギグに接続しました。
OSとしてUbuntu 14.04を選択しました(DOではUbuntu 14.04 LAMPアセンブリ)。
LAMPはコントロールパネルに必要です。phpを個別にインストールできます。 テストを実行するには、ブラウザー(Firefoxでテストします)、ブラウザーをバックグラウンドで起動するXvfb 、デスクトップにリモート接続するためのGUI + XRDPサーバー 、メールに結果を送信するExim 、 Java + Selenium + PhpUnit + php curlが必要です -テストが機能するため。
システムをアップグレードし、FFをインストールします。
sudo apt-get update sudo apt-get upgrade sudo apt-get install firefox
必要に応じてSWAPに接続します。
sudo dd if=/dev/zero of=/home/swap-tmp bs=1024 count=1024K sudo mkswap /home/swap-tmp sudo swapon /home/swap-tmp echo "/home/swap-tmp swap swap defaults 0 0" | sudo tee -a /etc/fstab
この例では、RAMを1GBに追加しました。
バックグラウンドとフォントでFFを実行するためのシェルであるxvfbを配置します。
sudo apt-get install xvfb sudo apt-get install -y xfonts-100dpi xfonts-75dpi xfonts-scalable xfonts-cyrillic xvfb x11-apps
必要に応じて、視覚環境でのリモート接続とテストのためにXFCE + Xrdpサーバーをインストールします。
apt-get -y install xubuntu-desktop apt-get -y install xrdp
/etc/xrdp/startwm.shにあったものを削除します-次のように書きます:
#!/bin/sh if [ -r /etc/default/locale ]; then . /etc/default/locale export LANG LANGUAGE fi #. /etc/X11/Xsession startxfce4
xrdpを再起動します。
service xrdp restart
これで、リモートデスクトップを介してサーバーに接続できます。
PHP + Curlをインストールします 。
sudo apt-get install php5 sudo apt-get install php5-curl
phpunitを配置します 。
wget https://phar.phpunit.de/phpunit.phar chmod +x phpunit.phar mv phpunit.phar /usr/local/bin/phpunit
JavaをインストールしてSeleniumを実行します。
apt-get install default-jdk
Seleniumサーバーの最新バージョンをダウンロードします 。 執筆の時点で、最新の2.43 :
mkdir /var/selenium/ wget http://selenium-release.storage.googleapis.com/2.43/selenium-server-standalone-2.43.1.jar mv selenium-server-standalone-2.43.1.jar /var/selenium/server.jar
通知を送信するには、exim4を配置します 。
sudo apt-get install exim4 exim4-config dpkg-reconfigure exim4-config
これらの目的には、Yandex.Mailを介したSMTPで十分です。 インターネットには多くの設定手順がありますので、これには焦点を合わせません。
セレンを正しく動作させ、バックグラウンドでFirefoxを起動するには、次のコマンドを実行します 。
Xvnc :10 -geometry 1920x1080 -depth 24 -bs -ac -nolisten tcp > /dev/null & export DISPLAY=:10
その後、Seleniumを実行できます 。
java -jar /var/selenium/server.jar
そして、最初の問題が現れました。 セレンは回線上でフリーズします:
04:04:29.264 INFO - Started HttpContext[/,/]
しばらくして、私を入れて、約15分後に開始しました。
デバッグを開始する場合:
java -jar /var/selenium/server.jar --debug 09:24:21.360 DEBUG [1] org.openqa.jetty.http.HttpContext - Init classloader from null, sun.misc.Launcher$AppClassLoader@356e3aaf for HttpContext[/wd,/wd] 09:24:21.361 DEBUG [1] org.openqa.jetty.util.Container - Starting org.openqa.jetty.jetty.servlet.ServletHandler@6c10fa4d 09:24:21.361 DEBUG [1] org.openqa.jetty.jetty.servlet.AbstractSessionManager - New random session seed
彼はセッションを作成するのが愚かであることがわかります。 判明したように、問題は私だけのものではなく、 / etc / java-7-openjdk / security / java.securityファイルを編集することで解決します。 次の行を置き換える必要があります。
securerandom.source=file:/dev/urandom
オン:
-Djava.security.egd=file:/dev/urandom
保存、再起動-すべてがOKです。
Seleniumをautorunに設定しました 。 /etc/rc.localで、次を追加します(ファイルの最後、または存在する場合はdieの前):
Xvnc :10 -geometry 1920x1080 -depth 24 -bs -ac -nolisten tcp > /dev/null & export DISPLAY=:10 sleep 2s java -jar /var/www/sao/demon/selenium/selenium-server-standalone-2.39.0.jar > /dev/null &
サーバーを起動すると、セレンが自動的に起動します。
ほとんどすべての準備が整いました。 テスト自体に残り、結果を伴うメールへの通知の送信と、転倒した場合のスクリーンショットの作成を構成します。 テストを自動的に実行するには、ポートをリッスンし、コマンドを受け取った後に必要なテストを開始する簡単なスクリプトをソケットで作成します。 バージン/プロダクションへのアップロード時にテストを自動的に開始するために、スクリプトラッパーを作成するか、バージョン管理システムのコールバック機能を使用します。
PS Yii 1.1に基づくテストを使用する人向け。 新しいバージョンのphpunitでは機能しません。 古いバージョンにアップグレードしないことにしました。
次のように問題を解決しました。
bootstrap.phpで、 yiit.phpをyiilite.phpに 、 Yii :: createWebApplicationをYii :: createConsoleApplication に置き換えました。
ファイル内のWebTestCase.php は、CWebTestCaseをextends PHPUnit_Extensions_SeleniumTestCaseに置き換えます
CWebTestCaseからすべての機能を転送しました 。