英語中心多言語対応アプリのテストにおける言語間差異に関するハック・Tips集

これはソフトウェアテストアドベントカレンダー #220日目の記事です。

qiita.com

目次

TL;DR

英語を中心に多言語対応しているアプリをテストしていて使うようになった、主に言語間差異に関するハック・Tips集

前提

自己紹介

id:wifeofvillonです。Twitterその他もだいたい同じユーザー名です。

Drivemode Inc.という米スタートアップ企業の東京オフィスで、今年から週4のQAスタッフとして働いています。オフィスの1/3、社内の半分くらいが非日本語話者で、社内公用語は英語です。

現在のチームは自動テストを含んだCI環境が整っている(できるだけ整えるようにしている)ので

  • メインプロダクトの正常系回帰テスト(手動)
  • 追加機能・バグ修正箇所の動作確認(手動)
  • 新規プロジェクトやデザイン変更時のUI/UXレビュー
  • プロトタイプアプリのフィードバック

などを主業務として、開発・テスト用ドキュメントの作成・更新や手動検証環境の整理をしています。

BtoB/C系開発者→BtoC系HTMLコーダー→現職(QA)という経歴であること、これまでQAや検証担当者がいるチームに参加したことがないことから

  • よその会社のチームでは機器管理とかテスト項目管理とかテスト実行結果評価とかテストチームの作業範囲の認識合わせとかどうしてるんだろう
  • こういう👆話をしているコミュニティってどこかにはあるんだろうけど、実際どこにあるんだろう1

と思っていたので今回アドベントカレンダーに参加しました。何卒ご指導ご鞭撻のほどよろしくお願いします。

関わっているプロダクトについて

今働いているのは米国の企業です。メインプロダクトは運転中のドライバーをサポートするアプリですが、米国を中心に世界中のあちこちの大地をユーザーと共に走っています。そのため英語、特に米国内での機能実装を最優先とし、アクティブユーザーの比較的少ない日本語の優先度は低めになっています。

今回は英語メインの多言語対応アプリのテストをしたときに体験した、日本向けのサービス/ソフトウェア開発ではあまり意識していなかったテスト項目/Tips/ハックについてラフに書きます。

合成音声/音声入力に関するハック・Tips

ここからは特に注記がない場合、便宜上「日本語を母語とする日本語話者」を「日本人」、「日本語以外を母語とする英語話者」を「外国人」と呼称します。

TTSの英語が聞き取れないとき

メインプロダクトはTTS(text to speech)のウェイトがめちゃくちゃ大きく、ほぼ全ての画面で音声を確認する必要があります。

私の英語力はとても低いので、短い文ならまだしも2文以上の文章になってくると聞き取るのがかなりつらくなってきます。
現在システムがすごく長い文章を喋ることはほとんどないのですが、聞き慣れていないある程度長さのある自然な文字列を聞いて確認するテスト(例: メッセージ内に含まれるemojiを読み上げる)でちゃんと単語を聞き取りたいとき、私の場合は音声合成エンジンをEnglish(United States)からEnglish(United Kingdom)に変更すると単語が聞き取りやすくなります2

聞き取りにくい単語

私だけかもしれないんですけど、GoogleAndroidバイスPixelがTTS(EN-US)だと「ピッセル」に聞こえるしPixel XLのXLも「エッセ」に聞こえるのでもうTTS関係ないんですけど「外国人メンバーからXLを借りたつもりでいたら普通のPixelだった」みたいなことがあって……大変恥ずかしい思いを……3

TTSエンジンのない言語

TTSを多用するアプリでTTSエンジンがないときの挙動を確認したいときは言語設定をヘブライ語にするとほぼ確実にTTSエンジンが実装されていません。

ただ、ヘブライ語はRTL言語(後述)かつヘブライ文字なので設定を戻すのにめちゃくちゃ苦労するので気をつけてください。

自分の英語を聞き取ってもらえないとき

メインプロダクトは音声入力も多用します。2018年師走、スマートスピーカー関連などでVUIの実装・テストをしていてA……とかG……の「すみません、聞き取れませんでした」にストレスを溜めている人も多いと思います。

個人差はあると思いますが日本人が発音しにくい単語はわりとあるなと思ってて、私は「previous」「launch」がとても苦手です4

ハックとしてよくやるのは

  • 文章として成立させる(例: replyreply to message)
  • 合成音声を使う

の2通りで、後者についてはMacならターミナルで以下のように入力5すればいい感じに発音してくれます。他のOSでもいろいろやりようはあるっぽい6

$ say -v Alex "previous"

Webでも無料の読み上げサービスがあるのでいろいろ(コンプライアンスに反しない程度で)試してみてください。

英語圏の固有名詞を聞き取ってもらえないとき

昔から香港とか台湾の人がルーシーとかジェーンみたいな英語名名乗るの何でだろう、おしゃれだな〜と思ってたんですけどあれめちゃくちゃ実用的だったんだな〜と実感しました。
というのはいかにも日本語っぽい固有名詞を英語で入力しようとしても失敗することが多いからです7

これを英語でやろうとするとsayコマンドをもってしても失敗しがちなので

  • アドレス帳の登録名を英語っぽい名前にする
  • (和製)英語を使ってる地名・店名を使う
  • 汎用的な単語で表せる場所にする(例: museum、park)

みたいなハックをしています。

私の職場でのニックネームは「Yukkie」なんですけどこれもめちゃくちゃ音声入力しづらいので、自分の電話番号は「Jerry」みたいに英語っぽい名前で登録しています。あと試験端末の一部に宇宙飛行士の名前+アメリカ/イギリスの空母・戦艦の名前をつけています。

固有地名では都内だと「東京スカイツリー」「東京ビッグサイト」みたいな東京+英語の文字列は入力しやすいです。
あと世界中どこにでもありそうなチェーン店(例: スターバックスマクドナルド)と「皇居(Imperial Palace)」はちょーつよい。おすすめ。
汎用かつ比較的長い文字列で他に似たような施設が少ないものの代表で「神代植物公園(Jindai botanical garden)」もよく使います。

音声入力に成功していることを確かめる場合はこれで十分で、もちろん、音声解析エンジンそのものや検索APIそれ自体のテストをする場合はちゃんと日本語っぽい文字列を使った方がいいでしょう。

非アルファベット言語に関するハック・Tips

今世界で多く使われている文字ってすごくざっくり言うと漢字みたいな表音文字表語文字があって、前者の中にアブジャド(アラビア文字ヘブライ文字はこれ)、アルファベット(キリル文字ギリシャ文字もこれ)、アブギダ(タイ語はこれ)、あとハングル文字みたいに分けられます。

あと日本語や中国語は縦書きのとき右から書きますが、アラビア語ヘブライ語は横書きでも右から左に書くRTL言語(Right-to-Left)なので標準UIの左右(TRUE/FALSEのボタン配置など)が逆になります。

文字溢れを起こしやすい言語

文字溢れによるレイアウト崩れが起こっていないかの確認はUIテストで避けては通れないものですが、同じ意味をさす言葉であっても日本語中国語では数文字なのに、別の表音文字言語ではめちゃくちゃ長い文字列になることがあります。
各言語をちゃんと学んでいる・意味がわかっている訳ではないので体感でしかないのですが、ロシア語・フランス語・スペイン語は英語に比べて文字列が長くなりレイアウト崩れを起こす印象があります。

RTL言語のレイアウト崩れ

上でRTL言語について触れましたが、システム言語設定がRTL言語になっているとAndroidの標準UIはLTR言語とは左右逆になります。それに合わせてレイアウトを直していく必要がある8ので、対応している場合テストケースに含めておいた方がいいと思います。

おわりに

本当は「TZを変える必要があるテスト」とか「Xperiaでのテストはそんなに重要じゃない代わりに絶対にGalaxyでテストしなきゃいけない」みたいな話題も書きたかったのですが長くなったのでまた機会があれば。

それでは皆さま良いお年を。

実践 Appium

実践 Appium


  1. Androidアプリ開発界隈にいると手動テストに関する話題をあんまり聞かない(テスト自動化はよく聞く)気がする

  2. 容認発音の方がそれぞれの単語が聞き取りやすい気がする。意味がわかるかどうかは置いておいてCNNとBBCを聴き比べてみるといいかもしれません

  3. そういえばNexus 6でもそういうことがあった気がする……

  4. 知り合いのエンジニアは「what」とか「when」みたいなWHから始まる単語が駄目らしいので本当個人差

  5. Macのsayコマンドの使い方 - Qiita

  6. macOS, Ubuntu, Windowsでの日本語テキスト読み上げ - Qiita

  7. 私が日本人だからかもしれないし、そもそも音声解析エンジンが日本語っぽい単語を解析するに至ってないのかもしれない

  8. C93 Android モダンプログラミングに RTL 対応の章を書きました - Infinito Nirone 7