質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

2回答

328閲覧

javascriptのテストツールについて

souta-haruran

総合スコア88

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2019/05/23 02:20

概要

複数のページを持つウェブページが存在し、ヘッダーにはナビゲーションがあります。
ナビゲーションには、result conversion summary adという項目があり、それぞれにリンクが貼られています。
そのリンクをクリックすることで該当ページに遷移するという一般的なものです。

ナビゲーションにあるリンク先のページは一つ一つ別ファイルのvueファイルで構成されており、それらに何らかの修正が必要になった場合は該当のファイルをそれぞれ修正する必要があります。

この時、修正したものが正しく動いているかテストを行うわけですが、テストの内容は以下の通りです。

例1) resultページを修正した場合(ファイル名:result.html) 1. トップページを開く 2. ナビメニューからresultを選択しクリックする 3. resultページに遷移する 例2) summaryページを修正した場合(ファイル名:summary.html) 1. トップページを開く 2. ナビメニューからsummaryを選択しクリックする 3. summaryページに遷移する

実現したいこと

現在下記のようなコードでテストを行っています。

javascript

1'case1': function test(browser) { 2 const devServer = ウェブページのURL; // http://hoge.jpなど 3 browser 4 .url(devServer) 5 .waitForElementVisible('#app', 5000) 6 .click('#result') // result.htmlを修正したのでresultページを開きたいため 7 .waitForElementVisible('#pege-result', 5000) 8 .end(); 9}

この.click('#result')の部分ですが、現在修正したページに合わせて手動で書き換えているのですが、動的に書き換えれるようにしたいのです。

発生している問題

上記コードでは、summaryページを修正したら、.click('#result')'#result'の部分を#summaryに手動で書き換えてテストを実行する。ということを行っているのですが、これでは修正したページに併せて#resultの部分を都度手動で書き換える必要があります。

これを動的に書き換える手段がないものかと調査したのですが解決に至らず質問させてもらいました。

ただそもそもそんなことが可能なのか否かも調査中でまだはっきりとわかっておらず、実現可否含めてお教えいただけると幸いです。

補足情報

使用しているテストツールはnightwatch.jsです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

miyabi_takatsukさんの方針で基本的には良さそうですが、
まだ手動でやってない?UIテストを爆速で自動化できるNightwatch.jsが便利すぎを見る限り一工夫必要そうですね。

なので関数に引数を束縛するとっておきのテクニックを紹介します。


まず質問文のコードはだいたいこんな感じになっているだろうと推測されます。

JavaScript

1module.exports = { 2 'case1': function (browser) { 3 const devServer = ウェブページのURL; // http://hoge.jpなど 4 browser 5 .url(devServer) 6 .waitForElementVisible('#app', 5000) 7 .click('#result') // result.htmlを修正したのでresultページを開きたいため 8 .waitForElementVisible('#pege-result', 5000) 9 .end(); 10 } 11};

このcase1はbrowserを引数に取る関数であれば良いんですよね。
そうであれば下記のように書き換えても行けるはずです。

JavaScript

1const test = function (browser) { 2 const devServer = ウェブページのURL; // http://hoge.jpなど 3 browser 4 .url(devServer) 5 .waitForElementVisible('#app', 5000) 6 .click('#result') // result.htmlを修正したのでresultページを開きたいため 7 .waitForElementVisible('#pege-result', 5000) 8 .end(); 9} 10 11module.exports = { 12 'case1': test 13}

次は#resultの部分を関数の外から注入する方法について解説します。
JavaScriptには全ての関数にbindというメソッドが存在し、引数を覚えさせるが実行は待つという事が出来ます。
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Function/bind

JavaScript

1const add = function (a, b) { 2 return a + b; 3} 4console.log(add(1, 2)); // 3 5 6// 第一引数に予め5を設定したadd5を定義 7const add5 = add.bind(null, 5); 8console.log(add5(10)); // 15 9 10// 3を設定したadd3も作ってみる 11const add3 = add.bind(null, 3); 12console.log(add3(7)); // 10 13 14// add関数はこわれてないだろうね? 15console.log(add(2, 3)); // 5 <- 問題なし

こうすることで「引数は設定するが実行するのは待つ」事が可能です。
この仕組みをコードに取り入れて見ましょうか。

JavaScript

1const test = function (selector, browser) { 2 const devServer = ウェブページのURL; // http://hoge.jpなど 3 browser 4 .url(devServer) 5 .waitForElementVisible('#app', 5000) 6 .click(selector) // result.htmlを修正したのでresultページを開きたいため 7 .waitForElementVisible('#pege-result', 5000) 8 .end(); 9} 10 11module.exports = { 12 'case1': test.bind(null, '#result'), 13}

より実践的には色んなものを注入したいとなるので、
アロー関数カリー化も駆使しつつ、オブジェクトを渡すようにするのがキレイだと思います。

JavaScript

1const test = options => browser => { 2 browser 3 .url(options.url) 4 .waitForElementVisible(options.app, (options.timeout || 5000)) 5 .click(selector) 6 .waitForElementVisible(options.wait, (options.timeout || 5000)) 7 .end(); 8} 9 10// ここまで抽象化すると最初のコードを変にラッピングしただけになるので加減が難しい 11module.exports = { 12 'case1': test({ 13 url: 'http://hoge.jp', 14 app: '#app', 15 selector: '#result', 16 wait: '#pege-result' 17 }), 18}

投稿2019/05/23 02:57

miyabi-sun

総合スコア21158

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

souta-haruran

2019/05/23 06:41

細かく、そして実践的な面を考慮していただいたコードをいただきありがとうございます。 勉強のためにも参考にさせていただきつつ、ちゃんと自分でも考えながら形にしていきたいと思います。
guest

0

nightwatch.jsがどんなものなのか存じ上げないので、的外れかもしれませんが・・・、
testメソッドに、第二引数を入れれるのであれば、

javascript

1'case1': function test(browser, pageId) { 2 const devServer = ウェブページのURL; // http://hoge.jpなど 3 browser 4 .url(devServer) 5 .waitForElementVisible('#app', 5000) 6 .click('#' + pageId) // result.htmlを修正したのでresultページを開きたいため 7 .waitForElementVisible('#pege-' + pageId, 5000) 8 .end(); 9}

のようにすればいいのではないでしょうか?

投稿2019/05/23 02:31

miyabi_takatsuk

総合スコア9528

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

souta-haruran

2019/05/23 04:15

ありがとうございます。 確かに引数使えばいけそうです。 ご意見いただきありがとうございます、勉強させていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問