.

JSTQB ALTA 学習方法

2021/02/13 に受検した JSTQB ALTA に受かっていました.
去年も受けて落ちたので 2 回目の受検でした.

勉強方法をメモとして残します.

2020/02 に受けたとき

  1. (メイン) JSTQB Advanced Level テストアナリスト問題集
  2. (少々) Advanced Level シラバス日本語版 テストアナリスト

問題集を一通り解いて, 解説を見て理解する, 時折シラバスを確認, していました.
このときはシラバスの読み込みが不足していたと思います
テストを受けた感触としては全く分からないのはなかったけど迷ったものがちらほらあったな, という感じです

2021/02 に受けたとき

  1. (メイン) JSTQB Advanced Level テストアナリスト問題集
  2. (一通り目を通す) Advanced Level シラバス日本語版 テストアナリスト

2020の受検のときと同じように, 問題集を解きました
解答の解説と一緒にシラバスを確認しました (問題集以外の問題が出されたときを想定しつつ確認)

2020, 2021を通して見ても, 問題に慣れるために問題集はとても役立ちました
twitter を見ていると他の参考書が役に立ったという方もいらっしゃいました

Software testing own notes

Software testing approach

  • Keep in mind
    • [Phase] Test process
      • (In short) Plannig -> Analysis -> Design -> Implementation -> Execution
    • [Type] Test type
      • Functional / Non-functional / White-box / Change-related
    • [Level] Test level
      • Component(Unit) / Integration / System / Acceptance
    • [Evaluation]
      • See https://en.wikipedia.org/wiki/ISO/IEC_9126
      • More likely to use Functionality, Reliability, Usability, Efficiency as QA point of view
        • Of course, Maintainability, Portability are also important as development point of view

Test strategy in agile

Test plan in agile

  • Based on test planning at ISTQB
    • [Scope, Objectives, and risks of testing]
      • Scope: (e.g.) Developed new features and affected existing features
      • Objectives: (e.g.) To achieve product quality which can be released to user at the end of sprint
      • Risks of testing: (e.g.) Feature A is full-scratch so, feature B has complicated logic so
    • [Defining the overall approach of testing(Test strategy)]
      • See above
    • [Integrating and coordinating the test activities into the software lifecycle activities]
      • See “Process in agile”
    • [Scheduling of test activity, process]
      • Who / What / When / Why
    • [Selecting metrics for test monitoring and control]
      • TBD
    • [Budgeting for the test activities]
      • TBD
    • [Determining the level of detail and structure for test documentation]
      • TBD
  • ACC planning

Process in agile

  • More automation, less manual (From common sense as agile)
  • Practice example
    1. 2wk = 1 sprint
    2. w1.1-5
      • Big developments
      • Analysis/Design/Implementation test
    3. w2.1: testing on new features
    4. w2.1-3: Bug fix, Small developments
    5. w2.4: testing for release
    6. w2.5 release

Test report

  • Should be defined in test plan
  • [Important]
    • To gather materials to judge if we can release product to customer or not
    • [Point]
      • Developed features in sprint / Existing features
      • Evaluation of software quality(e.g. Functionality, Reliability)

Test/QA engineer in agile team

  • Always think customer first (Of course, all team members :D)
  • Coaching software testing/software quality in team
  • Responsible for testing approach in team (e.g. test strategy, test plan)
  • Responsible for team productivity (Productivity engineering)
  • Maintain tools like scripts, CI

Test in agile

  • [7 Software Testing Principles] Testing is context dependent
    • Need to defind context like target quality, deveopment process in test plan

Exploratory testing in agile

  • Exploratory testing is convenient in agile context since it’s not heavy and effective to find bug.
    • [How to use]
    1. To find bug on new features
    2. To check if prodcut can be released
  • Exploratory testing is just style, not method. Need to define how to use exploratory testing in team

Scripted test in agile

  • (Example) Scripted test covers main user scenario
  • Think automation always

Automation in agile

  • Test pyramid -> UT : IT : UI = 7 : 2 : 1
  • Layer
    1. [Low level] Component(Unit) Test
      • Covered logic (File name generator, etc)
      • By JUnit in Android
    2. [Mid level] Integration test
      • Internal sequence between classes
      • By Instrumented test in Android, etc
    3. [High level] UI layer
      • User action/Non functional requirement
      • (Android) By Appium, Uiautomator, Espresso, etc
  • Others
    • [Reliability] Monkey(Android)

Azure pipeline で Appium を走らせて, Android, iOS のテストを走らせる

Azure pipeline で Appium を走らせて, Android, iOS のテストを走らせることができます

Azure pipelines

オープンソースプロジェクトであれば時間制限なしで無料で使用できます

https://azure.microsoft.com/ja-jp/services/devops/pipelines/

以下は以前contributeしたものです
まずは azure-pipelines.yml を以下のように書いて, 実体は ./ci-jobs/functional_test.yml にあります

azure-pipelines.ymllink
5
6
jobs:
- template: ./ci-jobs/functional_test.yml

このあたりで必要なパラメータを設定しています

functional_test.ymllink
1
2
3
4
5
6
parameters:
vmImage: 'macOS-10.15'
pytestOpt: '--doctest-modules --junitxml=junit/test-results.xml --cov=com --cov-report=xml --cov-report=html'
androidSdkVer: 27
xcodeForIOS: 12.3
CI: true
  • vmImage: コマンドを実行していくマシンのOSです
  • pytestOpt: pytest の option
  • androidSdkVer: 使用するAndroid SDK ver. 作成する Emulator の OS に影響します
  • xcodeForIOS: 使用する xcode ver. 作成する Simulator の iOS に影響します

Appium を走らせる

実体は functional/run_appium.yml

run_appium.ymllink
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
steps:
- task: NodeTool@0
inputs:
versionSpec: '12.x'
displayName: Install Node 12.x
- script: npm install -g appium@beta --chromedriver_version='2.44'
displayName: Install appium
- script: npm install -g opencv4nodejs
condition: eq('${{ parameters.opencv }}', true)
displayName: Install opencv4nodejs
- task: UsePythonVersion@0
inputs:
versionSpec: '3.x'
- script: brew install ffmpeg
displayName: Resolve dependencies (Appium server)
- script: python setup.py install
displayName: Install python language bindings for Appium
- script: |
pip install pipenv
pipenv lock --clear
pipenv install --system
displayName: Resolve dependencies (Python)
- script: |
git --no-pager log -n1
python --version
ffmpeg -version
appium --version
node --version
displayName: Check versions
- script: nohup appium --relaxed-security > appium_log.txt &
condition: ne('${{ parameters.dont_run_appium }}', true)
displayName: Run Appium in background

ざっくり

  • node インストール
  • npm で appium をインストール
  • (必要に応じて opencv4nodejs をインストール)
  • ffmpeg インストール (screen recordするために必要)
  • appium-python-client をインストール
  • pip で dependency の解消
  • インストールしたものの ver 一覧列挙
  • appium を走らせる

iOS

実体は ./functional/run_ios_test.yml

ios_setup.ymllink
1
2
3
4
5
6
steps:
- script: sudo xcode-select -s /Applications/Xcode_${{ parameters.xcodeVersion }}.app/Contents/Developer
displayName: Xcode Select ${{ parameters.xcodeVersion }}
- script: xcrun simctl list
displayName: List Installed Simulators

こちらでは Simulator を起動するために xcode の ver を指定
iOS についてはテストを走らせる中で Simulator が起動するようになっているので, あとは pytest でテストを走らせるだけで ok

Android

実体は ./functional/run_android_test.yml

start-emulator.shlink
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#!/usr/bin/env bash

# This file comes from https://github.com/appium/ruby_lib_core

# This script was copy-pasted from https://docs.microsoft.com/en-us/azure/devops/pipelines/languages/android?view=azure-devops#test-on-the-android-emulator
# with some changes

# Install AVD files
declare -r emulator="system-images;android-${ANDROID_SDK_VERSION};google_apis;x86"
echo "y" | ${ANDROID_HOME}/tools/bin/sdkmanager --install "$emulator"

# Show a list of emulators
${ANDROID_HOME}/tools/bin/avdmanager list

# Create emulator
echo "no" | ${ANDROID_HOME}/tools/bin/avdmanager create avd -d "Nexus 6" -n testemulator -k "${emulator}" --force

echo ${ANDROID_HOME}/emulator/emulator -list-avds

echo "Starting emulator"

# Start emulator in background
nohup ${ANDROID_HOME}/emulator/emulator -avd testemulator -no-boot-anim -no-snapshot > /dev/null 2>&1 &
${ANDROID_HOME}/platform-tools/adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed | tr -d '\r') ]]; do sleep 1; done; input keyevent 82'

${ANDROID_HOME}/platform-tools/adb devices

echo "Emulator started"

こちらでは Android Emulator を起動しています
元となっているファイルは azure pipelines 公式からもってきています

この後に pytest でテスト走らせることができます

Tips

Azure pipeline でテストを実行して, 失敗したとき, なぜ失敗しているか追いにくいので, screen record (画面録画)を取得するようになっているのでそちらも参考に

リモートワークのために購入したもの2

USB -> HDMI アダプタ

こちらを使用して現在ノートPCですが, 3枚のディスプレイを使用しています
元々使用しているノートPCに DVI, HDMI を挿すことが出来たので, そこに +1 枚という形です
Windows だと特に追加でドライバやソフトをインストールすることなく使用できます

「シングルモニターをデュアルモニターに変更しただけで、デスクワークの生産性が42%向上」という報告があるそうです
3枚だと,,,

参考(英語)
https://www.steelcase.com/research/articles/how-multiple-monitors-affect-productivity-and-wellbeing/

macOS

macOS だと DisplayLink Manager をインストールして, そちらを実行しておく必要があります

https://www.displaylink.com/downloads/macos

Hexoのことはじめ (Hexo1)

先日思い立ってblogを立ち上げたときにやったことを残していきます.

ホスティングと静的サイトジェネレーター

ホスティングは Github Pages

無料で始めたかったので Github Pages を使用することにしました
以前 API doc の公開で Github Pages を使用していたのも理由になります

静的サイトジェネレーターは Hexo

Github Pages を使用する際, 「静的サイトジェネレーター」を使用する必要があります
( wordpress はDatabaseに情報を格納しているタイプで Github Pages での使用は不可 )

「静的サイトジェネレーター」の一覧はこちらで確認できました
星が多いと使用者が多く, 情報もたくさんころがっていることが期待できます

https://jamstack.org/generators/

JavaScript がいいな, くらいでその後にまず試した Hexo で問題なかったのでそのまま使用しています
また Next.js, Gatsby を見てみてよさそうだったら移るかもです

  • (追記) Next.js はサンプルのページを試してみたが, リッチなUIも可能だけど少々慣れるまでにコストがかかりそうなので, 現在の使い方としてまずは Hexo でよさそう

Hexo

https://hexo.io/

日本語はありませんでしたが, こちらが公式サイト
Qiitaで調べてもいろいろ記事は出てきます

基本

以下を実行後に http://localhost:4000 へアクセスするとサイトが表示されます

1
2
3
4
5
npm install hexo-cli -g
hexo init blog
cd blog
npm install
hexo server

記事の作成

以下のコマンドを実行すると, source/_posts/title.md が作成されるので, そちらに記事を書いていく

1
hexo new 'title'

テーマ

多くのテーマがあるようです

https://hexo.io/themes/

が, 現在はデフォルトの landscape を使用しています

リモートワークのために購入したもの1

リモートワークのために購入してよかったものリストです
何かのご参考になれば

ゲーミングチェア

値段がそこまで高くなく, 長時間座っていても疲れないのでコスパが高いです (ダイニングの椅子比較)
高いオフィスチェアなどもあるので, 予算に余裕があればそちらを検討するものありです.

ディスプレイ

仕事内容にもよりますがディスプレイは多いほどよいです
「シングルモニターをデュアルモニターに変更しただけで、デスクワークの生産性が42%向上」という報告があるそうです

参考(英語)
https://www.steelcase.com/research/articles/how-multiple-monitors-affect-productivity-and-wellbeing/

現在の使用方法として縦置き2台+横置き1台をしています
縦置きおすすめです

Appiumで特定のelementが表示されるまで待つ

必要な背景

以下のようなケースで役に立ちます

  • (特にAndroid) 端末の動作が遅い時などに画面遷移で時間がかかるとき
  • ネットワークの状態によって待ちが発生するとき

Azure pipeline上のAndroid emulatorでAppiumを動作させるときに活躍しました

Sample code

以前自身で作成したコードです (contribution)
https://github.com/appium/python-client/blob/master/test/functional/test_helper.py

test_helper.pylink
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
def wait_for_element(driver: 'WebDriver', locator: str, value: str, timeout_sec: float = 10) -> 'WebElement':
"""Wait until the element located

Args:
driver: WebDriver instance
locator: Locator like WebDriver, Mobile JSON Wire Protocol
(e.g. `appium.webdriver.common.mobileby.MobileBy.ACCESSIBILITY_ID`)
value: Query value to locator
timeout_sec: Maximum time to wait the element. If time is over, `TimeoutException` is thrown

Raises:
`selenium.common.exceptions.TimeoutException`

Returns:
The found WebElement
"""
return WebDriverWait(driver, timeout_sec).until(EC.presence_of_element_located((locator, value)))

上記の wait_for_element が定義されている状態で, 以下のコードで動作します

1
2
# 'Bouncing Balls' というテキストを持つelementを 10 秒のタイムアウトで待つ処理. 返り値は検出したelement.
el = wait_for_element(self.driver, MobileBy.ACCESSIBILITY_ID, 'Bouncing Balls')

Mac用USB Type C Hub (4in1)

Macを購入したので以下のUSB Hubを購入

websiteはこちら

https://tuwejia.com/

USB HubがないとUSB Aの挿し口がMacbook Airにないため購入

調べると類似の商品はたくさんあるのですが, あまり違いが分かりませんでした

要件としては以下の通りでした

  • 安い (2000円弱)
  • 小さい
  • Display port(HDMIなど)があること
  • USB A の port があること

結果として概ね満足です
残念なこととしては, 2台目のDisplayが使用できなかったことです
(解像度が低い, 縦画面のDisplayに設定するとDisplaylink managerがクラッシュする)

近々少々高いUSB Hubを購入する予定なのでこちらは繋ぎです

Appium で screen recordを使用する

Official な document では少々不足していたので, 使い方をまとめます.

1
2
3
4
5
6
7
8
self.driver.start_recording_screen()

payload = self.driver.stop_recording_screen()

# ★この2行
with open('video.mp4', "wb") as fd:
fd.write(base64.b64decode(payload))

使用用途

ローカル実行にて

ローカル実行であれば実際に目で見ての確認で十分かもしれません
しかし, 不具合起票時に他の人に見せるときなどに screen record があれば, そちらを元にやりとりできればコミュニケーションコストを下げることができます.

Azure pipeline にて

Azure pipelineではテストが失敗したときになぜ失敗したのか追いにくいため, screen record で動画を取得しておくとよいです
その後は azure pipeline の artifact から動画を取得して実際にテストを走らせているときの端末の画面を録画した動画を確認することができます

参考: https://github.com/appium/python-client/blob/master/test/functional/android/helper/test_helper.py

Links

Hexo で Amazon associate (Hexo2)

Amazon アソシエイトに関しては, Amazon でアソシエイト登録を行った後に各商品のリンクを生成できるようになります
そのリンクが以下のような形になっています

1
2
<iframe style="width:120px;height:240px;"marginwidth="0" marginheight="0" scrolling="no" frameborder="0" src="https://rcm-fe.amazon-adsystem.com/e/cm?ref=qf_sp_asin_til&t=ki4070ma-22&m=amazon&o=9&p=8&l=as1&IS1=1&detail=1&asins=B07RHYBPCJ&linkId=98a77a128392414ffe80bcb46daf13b9&bc1=ffffff&amp;lt1=_top&fc1=333333&lc1=0066c0&bg1=ffffff&f=ifr">
</iframe>

Hexo だと, article.md に以下の書式で書くことにより iframe を挿入することができます

1
{% iframe URL Height Width %}

Amazon アソシエイトのURLから, iframeのURL, Height, Widthを抜き出して, 以下のように書けます

1
{% iframe https://rcm-fe.amazon-adsystem.com/e/cm?ref=qf_sp_asin_til&t=ki4070ma-22&m=amazon&o=9&p=8&l=as1&IS1=1&detail=1&asins=B07RHYBPCJ&linkId=98a77a128392414ffe80bcb46daf13b9&bc1=ffffff&lt1=_top&fc1=333333&lc1=0066c0&bg1=ffffff&f=ifr 120 240 %}