今日から俺は

都内で働くエンジニア。調べて学んだことを蓄積していきます。

seleniumでchromedriverを使うとき

目的

seleniumでchromedriverを使うとき、FireFoxと少し動作が違うので注意が必要 * phpunitの場合は多分別。調べてないから、そのうち調べる。

/vendor/facebook/webdriver/lib/Remote/HttpCommandExecutor.php

ここに以下を追加

'chromiumSendCommand' => [ 'method' => 'POST', 'url' => '/session/:sessionId/chromium/send_command' ],

*他にいい方法ないだろうか。。。

参考

https://note.mu/743/n/n2c1c07062f7f

swiftの{get set}

実は

どう使えばいいか、あまり把握してなかったので、protocol定義するとき両方書いてた

getのみにする場合

こんな感じで取得するようにすればいいらしい。

protocol SparkTrajectory {

    /// Stores all points that defines a trajectory.
    var points: [CGPoint] { get set }

    /// A path representing trajectory.
    var path: UIBezierPath { get }
}

extension SparkTrajectory {

...

    var path: UIBezierPath {
        guard self.points.count == 3 else { fatalError("3 points required.") }

        let path = UIBezierPath()
        path.move(to: self.points[0])
        path.addQuadCurve(to: self.points[2], controlPoint: self.points[1])
        return path
    }
}

どこかのgithubのソースから持ってきた。 これで少しまた利口になりました。

fastlaneを使ってみる

目的

iOSのリリース、adhoc配信、自動テストにfastlaneを使っています。 それをjenkinsを使って動かしてます。 個人的にはこの組み合わせは、めっちゃ便利と思ってます。

その紹介です。

fastlaneインストール

rubyがないと動かないです。 macのデフォルトrubyでも良いのですが(多分)、バージョン管理のしやすさから、rbenvを選択してます。

rbenvのインストール

以下を参考に

qiita.com

最後に.zshrc、もしくは、.bash~に以下を忘れると切り替わらないのでお気をつけて。

bunlderをインストール

gem install bundler

で良いはず。もしかしたら、sudo要るかも。

Gemfileの中身

bundleコマンドでfastlane操作するために必要。プロジェクト直下に用意。 こんな感じ

source "https://rubygems.org"

gem "fastlane"
gem 'fastlane-plugin-bluepill', '~> 0.1.1'

plugins_path = File.join(File.dirname(__FILE__), 'fastlane', 'Pluginfile')
eval_gemfile(plugins_path) if File.exist?(plugins_path)

install

bundle install

初期化

bundle exec fastlane init

あとは、必要に応じてアクションを実行するのみ。 よく使うのは、 adhocバージョンの配信、 本番用アプリのアップロード 自動テスト あたりかな。

Appium 2

内容

phpunitでテストケースを書くにあたって、困ったことを書きます。

Appiumとphpunit

特にphpunit-seleniumがappium-php-clientとうまくマッチしなくて、 masterブランチしかマッチしない (最新のリリースバージョンは、うまくいかない)

どううまくいかない?

こんな感じ

$seleniumServerUrl = PHPUnit_Extensions_Selenium2TestCase_URL::fromHostAndPort($parameters['host'], $parameters['port'], $parameters['secure'])
/**
     * @param string $host
     * @param int port
     * @return PHPUnit_Extensions_Selenium2TestCase_URL
     */
    public static function fromHostAndPort($host, $port)
    {
        return new self("http://{$host}:{$port}");
    }

パラメータ数が合わず

で、どう解決させた?

composer.jsonでほしいブランチ指定

{
  "name": "ios_unittest_appium",
  "repositories": [
      {
          "type": "vcs",
          "url": "https://github.com/appium/php-client"
      }
  ],
  "require": {
      "appium/php-client": "dev-master"
  },
  "require-dev": {
        "phpunit/phpunit-selenium": "dev-master#6cd8b2acadd13d3f16b0e8cc41f8bbf50f4d1dec"
  }
}

これでも良いけど、未確認

v0.3.0 which is the latest php-client has no secure parameter. https://github.com/appium/php-client/releases/tag/v0.3.0
After the release, the secure parameter has been added. #46

appium

目的

WebViewのテストにcalabash iosを導入していたが、これがXcode9以降全く動かなくなったので 諦めて、appiumへ切り替え * calabash側に聞いたら、rubyのバージョン下げて、って言われて、下げたけど、改善しなかったので、 変わんないよ、って伝えて、諦めた。

使い所

iOSAndroidアプリのUIテストに使えて、さらにモバイルwebのテストにも使用できるっぽい。 かなり応用が効くと思われる。 *情報を確認しただけで、ちゃんと調べてはいないが、実機でも動作するようです。 当初2017年に調べてたときより大分進化した印象。

インストール

こちらを参考 https://pepese.github.io/blog/appium-basics/

まずは

画面にどういった要素があって、どこをどう動かしたら、画面遷移するのかとかをチェックする必要がある。 そのために、インスペクタを使う。

inspector

viewの要素がなんなのか、チェックするのに使用。 まずは、どういった要素があるかわからないと、UIテストが作れないため。 こちらを参考に https://qiita.com/Real_analysis/items/4fe0e887833a260eb9b9 https://github.com/appium/appium/blob/master/docs/en/writing-running-appium/caps.md

DesiredCapabilities

どのアプリをinspectorでチェックするかに使用する。 実際テストコードを書く際にも以下を使用する。

{
  "platformName": "iOS",
  "platformVersion": "11.4",
  "deviceName": "iPhone 7",
  "automationName": "XCUITest",
  "app": "アプリのパス"
}

こんな感じ。各アプリ、テストしたい端末に応じて、値を調節してやればいい。

Test

sample-codeを参考に動かせば良さげ https://qiita.com/tabbyz/items/187ef263b6ac3ba7b3bd

どの言語でテストコード書く?

phpunit採用。自分が一番慣れてるので。 javaでも良かったかなと思ってる。appiu-phpがあまり活発じゃないので。

注意点

phpunit-seleniumとappiumのPGが合わないところがある。 composer.jsonはこれを使うとよい

➜ cat composer.json
{
  "name": "ios_unittest_appium",
  "repositories": [
      {
          "type": "vcs",
          "url": "https://github.com/appium/php-client"
      }
  ],
  "require": {
      "appium/php-client": "dev-master"
  },
  "require-dev": {
        "phpunit/phpunit-selenium": "dev-master#6cd8b2acadd13d3f16b0e8cc41f8bbf50f4d1dec"
  }
}

サンプルで実行したコマンド

社内テストアプリで応募までを動かそうとトライしている。多分できそう。

ios_unittest_appium on  master [!] via 🐘 v7.2.9
➜ vendor/phpunit/phpunit/phpunit test/basic/appium_test.php

アプリを引数で渡す。

アプリのパスは作成者によって違うので、開発時は、コマンドライン引数で渡すようにしたほうが良い(と思う)。 PGを変更して、以下で実行できるようにした。

vendor/phpunit/phpunit/phpunit test/basic/appium_test.php app="アプリのパス" device="iPhone 7" version="11.4"

app,device,versionパラメータがないと、動かないようになってるので、注意。順番は変えても動くはずです。

webviewを操作していて、現在のURLを取得したい場合

社内環境か、どうか確認してから応募しないと、事故になるため。

$aryContext = $this->contexts();

// 2番目のindexがwebのコンテキストになってる
        $this->context($aryContext[1]);

        echo "WEBURL:".$this->url()."\n";
array(2) {
  [0]=>
  string(10) "NATIVE_APP"
  [1]=>
  string(15) "WEBVIEW_79437.1"
}

注意点として、終わったあと、NATIVE_APPに戻さないと、以降の操作ができなくなる。