Nightwatch and BrowserStack

Recently I’ve been using Nightwatch.js and BrowserStack for E2E testing. Nightwatch.js is one of E2E testing frameworks which provides Test Runner, Assertions, Commands and etc. It also allows us to create Custom Assertions and Custom Commands as well. BrowserStack provides cross browser testing environment. For example, it allows us to operate any browsers which are supported by BrowserStack it our own browser. It even enable us to test our localhost using Chrome extension. Furthermore, we can operate mobile devices such as iPhone and Android.

Automate testing

BrowserStack supports Nightwatch.js on their automate testing offering. Following is a link for it.

Selenium with Nightwatch

You need only a few installations and configurations. Basically it’s easy. But there’re some pitfalls to work with browsers on BrowserStack. I’m happy to share them below.

Make it works

Use Nightwatch.js v0.9.*

Current stable version of Nightwatch.js is v0.9. But there’s pre release version v1.0. Pre release version doesn’t work at all with BrowserStack regardless of type of testing such as local or remote. So it appears to me v0.9 is only a option to work with BrowserStack.

Choose remote testing over local testing

Local testing worked on my environment, but it wasn’t stable. So remote testing which specifies public URL must be easy. That’s more stable. Also, there’s a limitation for local testing on Safari (both macOS and iOS). We can’t use localhost.

I face issues while testing localhost URLs or private servers in Safari on macOS/OS X and iOS.

Use “retries” option

Probably this depends on an application, E2E is unstable sometimes. There’re many factors which affects E2E testing like browser, network, 3rd party services and etc. So specifying retries option makes sense.

Use waitForElementPresent over waitForElementVisible

Edge requires elements are actually shown in screen on waitForElementVisible. So it make problems on a tall screen. waitForElementPresent works well even when elements are not shown. This behavior only appears on Edge.

Tips

Specifying session name

If you do nothing special, sessions are named from test directories and files like Home / Timeline. This will make many duplications if you write plural tests in single file. In that case, you should specify session name.

browser.options.desiredCapabilities.name = 'Test A';

If you want session name automatically be specified from its test name, you can do something like this.

before: function (browser) {
  this.browserName = browser.options.desiredCapabilities.browser;
  this.baseName = browser.options.desiredCapabilities.name;
  this.steps = browser.currentTest.results.steps.slice(0);
}

beforeEach: function (browser) {
  let bsTestName = self.baseName;
  let localTestName = '';
  const [ nextTestName ] = browser.currentTest.results.steps;
  if (nextTestName) {
    const idx = this.steps.indexOf(nextTestName) - 1;
    if (idx >= 0) {
      localTestName = this.steps[idx];
      bsTestName = `${self.baseName} / ${localTestName}`;
    }
  } else {
    localTestName = this.steps[ this.steps.length - 1 ];
    bsTestName = `${this.baseName} / ${localTestName}`;
  }
  this.localTestName = localTestName;

  bsTestName = sanitize(bsTestName);
  this.bsTestName = bsTestName;
  browser.options.desiredCapabilities.name = bsTestName;
}

Update session’s result (if it failed)

Most of cases, sessions resulted in passed on BrowserStack even though it actually failed. If you want to know correct results on BrowserStack, you have to update session’s status using BrowserStack API like following.

afterEach: function (browser, done) {
  const API_PREFIX = 'https://api.browserstack.com/automate';
  const auth = {
    username: process.env.BROWSERSTACK_USERNAME,
    password: process.env.BROWSERSTACK_ACCESS_KEY
  };
  const resBuild = await axios.get(`${API_PREFIX}/builds.json`, { auth });
  const [ build ] = resBuild.data;
  const buildId = build.automation_build.hashed_id;

  const resSessions = await axios.get(`${API_PREFIX}/builds/${buildId}/sessions.json`, { auth });
  let session = null;
  for (const sess of resSessions.data) {
    if (sess.automation_session.name === this.testName &&
      sess.automation_session.browser === this.browserName) {
      session = sess;
      break;
    }
  }
  const sessionId = session.automation_session.hashed_id;
  const data = {
    status: 'failed',
    reason: ''
  };
  await axios.put(`${API_PREFIX}/sessions/${sessionId}.json`, data, { auth });
  done();
}

Aurora Serverless

Since Aurora Serverless became available from early this month, I started to use it for this blog’s database.

Impression

Though it took several seconds to connect to an Aurora instance for the first time after its launch, it’s quite natural since then. It responds quickly. It appears to me this is already practicable enough as long as I use it simply.

There’re many limitations such as only a few supported cluster parameters, no support for cross region replicas, etc. So it may be still early to use it for complicated scenarios.

Price

As for storage and I/O, it’s same to provisioned Aurora. But computing capacity which is called “Aurora Capacity Unit (ACU)” is kind of confusing. AWS website states “Pay only for the database resources you consume, on a per-second basis”, but it also states “$0.06 per ACU Hour” in a pricing page. I was not sure it will be billed per second or hour.

FAQ page states in detail.

You pay a flat rate per second of ACU usage, with a minimum of 5 minutes of usage each time the database is activated.

That says AWS bills by accumulated seconds per month, but there’s an hidden factor. When will database be deactivated after last request? This minimum of 5 minutes of usage won’t affect much if a database has constant requests, but I’m still interested in this internal behavior.

TOEIC 900点を超えるまで

先日の1月28日のTOEICの結果がでました。少し回り道した感もあったのですが、ようやく900点を超えたのでどのような学習をしたのか備忘録的に残しておきたいと思います。

結果

1月28日の結果ですが、内訳は下記のようになっています。

自分の英語遍歴

英語の勉強は高校まで、留学経験なしです。外資系勤務歴が長かったのですが、読み書きはたまにするものの英語で会話する機会はそんなに多くはありませんでした。社会人になってから1年Gabaに通った事がありますが、所謂TOEICの勉強はしたことがない状態です。当時のTOEICスコアは790でした。

主にやったこと

どういう事をやったのか時系列で整理します。

〜2017年3月(755点)

特にTOEIC用の勉強はしようとせず、英語に触れる機会を増やすように工夫してました。

  • Twitter/Facebookで英語アカウントをフォローする
  • 英語のPodcastを分からなくても日常的に聞く
  • Udemyで興味があるコースを英語で受講する

3月に久しぶりにTOEIC受験したら755点でした。以前とったことがある790より35点ダウンしてるのですが、調べてみると2016年5月の問題の改訂で難しくなったらしく人によっては50点ほどスコアが下がったそうです。そう考えると妥当なスコアだったのかもしれません。

2017年4月〜2017年9月(810点)

この時期からSkype英会話を始めました。相変わらずTOEIC用の勉強はしようとしませんでした。

  • Skype英会話(週3, 4日程度)

DMM英会話プラスネイティブプランを使っています。並行してPodcast等も聞いてました。Skype英会話を始めてから1,2ヶ月目の5月の試験で55点スコアが上がりました。おそらく少し試験慣れしたのもあると思います。当時は座学の英語を軽く見ていて、参考書などは全く見てませんでした。ただ、810から上がらなくなり次第に焦り始めます(年内に900取りたかったので)。ちなみにSkype英会話は今も続けています。

2017年10月〜2017年12月(895点)

英語が得意な友達からプレゼンスという英語学習のコーチングスクールを紹介してもらい、10月から2ヶ月間週1で通いました。けっこう宿題が出ます。教材もいわゆるTOEICの勉強という感じですが、下記のような学習をしました。

  • 文法書1冊
  • 文法問題集1冊
  • 単語集1冊
  • リスニング参考書1冊
  • 試験問題集1冊

これに加えて自分で長文対策問題集1冊と試験問題集1冊追加でやりました。2ヶ月の間おそらく週20時間以上は英語に使ってたと思います。合計で160時間以上ですね。12月10日の試験結果は895点でした。超惜しいですが、スコアとしてはほぼ900点と言える点数になりました。

そして、その1ヵ月後のTOEICで900点を超えたのですが、この期間はTOEICというよりは発音の勉強などをしていました。12月の試験ではやや勉強疲れしてたので力みすぎてないのが良かったのかもしれません。

効果的だった勉強法

思い返してみると最初のうちは「TOEICの点数だけ上がっても意味がない」と考えて参考書類は一切やらなかったのですが、結論から言うと「正しい知識」をしっかり理解して延々と反復して身体で覚えるというのが一番の近道でした。TOEICのスコアだけでなくSkype英会話などでも以前よりスムーズにコミュニケーションできるようになりましたし、英語で読むのがかなりラクになったと思います。PodcastやSkype英会話など雰囲気だけで進めてもぼくの場合は点数だけでなく実用においても途中で頭打ちになりました。

下記は今振り返ってみて最初からこうしておけば良かったと考えるひとつの勉強方法です。これからTOEIC900点目指そうという人でしたら参考になるかもしれません。少なくとも当時の自分にアドバイスしたいのは下記のような感じです。

1. 文法書理解→アプリで文法問題反復

文法は高校以来という人は半分くらいはやはり忘れてしまっていると思います。基礎レベルの文法の理解はやはり重要で文章の構造の解釈を間違えるとそれだけで意味を間違えてしまうので800点程度のスコアでまだ手をつけてないのであれば最初に着手するのが良いと思いました。基本レベルの文法書で十分です。

文法が理解できたら下記のアプリで「文法問題でる1000問」の問題を何度も解きます。

TOEIC対策支援アプリ:abceed analytics

解いた際に下記をしておくと良いです。

  • なぜこの答えになるかの自分なりの解説 -> 文法力定着
  • 20秒以内に通読して文章のSV構造把握&意味理解 -> 速読力アップ

2つ目の文章構造の把握は長文問題などにも効いてきます。アプリだと場所を選ばずできるのでオススメです。

2. 教材のCDを活用して単語1冊分暗記

単語集にもCD付録がありますが、使う人ってどれだけいるんでしょうか?ぼくはあまり使ってこなかったんですが、使ってみると案外良い事が分かりました。

  1. 単語の正しい発音が分かる
  2. 参考書なしで音源だけで勉強できる

いきなりCD音源だけ聞いてもスペルと一致しないのでだめなんですが、一度スペル見ておけば音声と照らし合わせられるようになるのでラクだと思います。これもアプリと同じで場所を選ばないですし、さらに寝ながら・お風呂に入りながら・運転しながらもできるのでオススメです。

ぼくは違う単語集をやったので使わなかったですが、出る単特急 金のフレーズ だと単語と一緒に例文も読まれるようなので、次に挙げているシャドーイングも取り入れながら聞くと暗記もしやすく一石二鳥だと思います。ちなみに金フレはアプリがあるので暗記チェックはアプリでやるのが良いかもしれません。

3. 問題集をやったらPart3,4音源を繰り返しシャドーイング

シャドーイングは音声の後に少し遅れて聞こえた文章をそのまま口に出して真似するという英語の練習方法です。難しいイメージがあったんですが始めてみると意外と手軽にできて良かったです。音読の練習は思ってた以上に英語力向上に効くんですが、リピーティングやオーバーラッピング等の音読はテキストが手元にないとできないです。対してシャドーイングは音声さえ聞ければできるので、歩きながらできます。ぼくはもっぱら歩きながらやドライブ中等に口ずさむようにしてました。

ポイントは最初に全ての文章を知らない単語全て調べる+構造を理解してから始める事です。分からないところがある状態でやると勿体ないです。そして何度も延々とやる。慣れてきたら1.2倍速〜くらいにしてやると良いと思います。速度を変えるアプリはiPhoneだと「速聴Music」「ABプレイヤー」などがあります。

まとめ

上記だけで900点いくかは人によりますしなにより量や時間で違ってくると思いますが、今の自分が振り返ってみて最短と思える勉強方法です。TOEIC対策のテクニックは色々ありそれは実際有効ですが、上記はどちらかというと基礎力を短期間で上げるためのルーチンのようなものです。今回はコーチングスクールに通ったおかげで途中で諦めることなく学習を継続できました。その中で最適化されていった習慣というか勉強方法が上記のような感じです。

900点超えたと言いつつ、これくらいだと多少英語を使うのがラクになったくらいで仕事で使うにはまだまだ支障があるレベルなので今後も継続して学習していきたいと思います。文法はもうそんなにやることがないので、今は単語と発音を中心に淡々とルーチンをこなしてます。TOEICも結果の点数的にはリスニングがまだ3,40点ほど伸びしろがありそうです。

今回、英語の学習は思っていた以上に「勉強」というより単純に「反復」と「量」だなと思いました。正しく理解したら延々繰り返すのが良いです。これって他の学問でも同じことが言えるのかもしれませんね。子供が公文の勉強をしてるのを見て全く一緒だなと思ったりしました。

2018年の行動指針

個人的なメモです。前回のエントリを書いて改めて思いましたが、今年は特に何かを大きく変えるというより昨年と変わりなく引き続き同じ方向性で改善を続けていきたい感じです。目標など設定してみます。

2017年をふりかえって

昨年から引き続き海外に視点が向いてます。今年も目標は「海外でも・あるいは海外と仕事ができる」ための素養を身につけるというところにあります。技術的には特化する領域の強化、それから英語のプライオリティが引き続き高いです。それから昨年は健康方面を疎かにしがちで、とは言え至って体調は悪くはなかったのですが、ただ体重が増えたり抜け毛・白髪が増えてきたりしてきました…。なので健康にも気をつけたいです。あともちろん家族も大事に。

2018年の具体的な目標

今のところ具体的に目標にしようと思っているのは下記の3つです。

  • TOEICリスニング満点
  • PWAアプリ開発・リリース(趣味)
  • 料理の趣味化(週1で作る)

「TOEICリスニング満点」は、昨年12月の受験で895点で900点に届かず悔しかったので。主な原因がリスニング(435点)でした。集中力の問題もあったのですが、やはりまだラクラク聞ける状態になっていないのかなと思いました。満点までいくとリスニング能力的にはだいぶ違ってくるのでコミュニケーションだったりそもそも英語の音声に触れるのがぐっとラクになると思っています。

「PWA」は2つほど趣味で作りたいものがあるので実践したいです。今年中にはSafariがService Workerに対応すると思われるので何か作るにはちょうど良いタイミングだと思っています。

料理は、主に健康のためなのですが、「食」に対する意識を上げるために料理を作るのが良いかなと思いました。同時に家族に対しても奥さんが喜んだり良い効果があります。最近は低糖質メニューなどのレシピ本も大量に出ているので参考にしてみようと思っています。

意識して習慣にしておきたい事

意識したい習慣のカテゴリとしては「技術」「英語」「健康」「家族」があるのですが、それぞれでバラバラなことをしていると時間が足りなかったり習慣化が難しくなりそうなので、なるべく一挙両得な効果がある事を優先して出来ると良いのかなと思ってます。

たとえば下記は本当にやるか分かりませんが

  • 英語x技術: 英単語アプリ開発、英語で情報収集、コーディングチャレンジ、Issuesウォッチ
  • 英語x健康: 健康に関する英語本、ウォーキングしながらシャドーイング
  • 英語x家族: 子供と英語アニメ、英語の唄を発音意識して歌う
  • 技術x健康: 自分の健康データ(体重・体脂肪率等)からAlexa
  • 技術x家族: 役立つAlexaスキルを開発 e.g. バス時刻表、学校時間割
  • 家族x健康: 家族でウォーキング、健康料理を作る
  • 英語x技術x健康: ヘルスデータから英語でAlexa e.g. 体重・体脂肪率の傾向からアラート
  • 英語x技術x家族: 子供の学習補助Alexa、Scratch英語動画を解説、英語で学習アプリ開発
  • 英語x健康x家族: 英語レシピ本で健康料理、家族ウォーキング時にシャドーイング
  • 英語x健康x家族: ヘルスデータから英語でAlexa e.g. 子供の運動量・体重の傾向

みたいな感じで一挙両得感を意識しながら生活するのも良いかなと思っています。ただ、この中の幾つかは既に実際にやってますね。たとえば子供とよく英語のアニメ見てますが子供も見たがるので習慣化しやすいです。今はRWBYというアニメをよく英語字幕で見ながら解説しつつ見てます。

仕事の傾向や意識しておきたいこと

昨年は、SPA(React/Redux)、静的型解析(FlowType)、GraphQL、Serverless Framework、Python、Headless Chrome等が利用する技術としては多かったように思います。今年は、上記に加えてPWAとDockerに触れる機会が増えると予想しています。

あとは開発以外のロール、特にビジネスとプロダクトの橋渡しみたいなところは関わりたい事が増えてきています。特に今関わっている仕事はいずれの仕事もビジネスを推進すればより英語に触れる機会が多くなるため、出しゃばっていくのも良いかなと考えています。可能であれば仕事の40%以上は英語にしてしまいたいものです。

その他

昨年はオーストラリア・アメリカに行きましたが、今年はどちらかというと中国が気になっています。ちょうど家族で仲の良い子供の友人宅が香港に引っ越した事もあり香港・深センに遊びに行ってみたいです。また、その他には国内ですが、北海道や四国にも行きたいです。

まとめ

以上、2018年の行動指針や目標でした。今後変わるかもしれませんが、まずは「TOEICリスニング満点」を目指して頑張りたいと思います。