本記事は、Shiny Advent Calendar 2018の2日目の記事です。
そして、Shiny100本ノックの第28弾です。
今回は、少し発展編として、Shinyのアプリケーションをテストするためのライブラリ、shinytestについて説明します。
なお、以下の書籍でもshinytestの使い方を紹介していますので、よろしければ購入ご検討を!
- 作者: 梅津雄一,中野貴広
- 出版社/メーカー: シーアンドアール研究所
- 発売日: 2018/11/07
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る
shinytestを導入したい理由
Shinyに限らずプログラムを書いていると、「途中まで正常に動作していたのに、ある変更を加えた途端に動かなくなる」ということが起こります。そんな悲しいことを防ぐために、要素ごとにテストを書いておくことが大切です。テストを書いておけば、機能を追加するたびにテストを実行して、既存のコードが壊れていないか確認することができます。
shinytestライブラリは、Shinyの各UI要素について、特定の値を設定した際の状態をスナップショットとして保存してくれます。しかも簡単に保存とテスト実行をして、壊れていないか表示してくれる、便利なライブラリです。
もし、規模の大きいShinyアプリケーションを作りたい場合は、ぜひshinytestを活用してください。
導入方法
最新のものを、Githubからインストールしましょう。Rコンソール上で以下を実行してください。
> library(devtools) > install_github("rstudio/shinytest") > shinytest::installDependencies()
簡単な使い方
shinytestを試す用の、適当なShinyアプリケーションをまず準備します。ui.R**
library(shiny) shinyUI(fluidPage( titlePanel("Old Faithful Geyser Data"), sidebarLayout( sidebarPanel( sliderInput("bins", "Number of bins:", min = 1, max = 50, value = 30) ), mainPanel( plotOutput("distPlot") ) ) ))
server.R**
library(shiny) shinyServer(function(input, output) { output$distPlot <- renderPlot({ x <- faithful[, 2] bins <- seq(min(x), max(x), length.out = input$bins + 1) hist(x, breaks = bins, col = 'darkgray', border = 'white') }) })
こちらの2ファイルを、shinytest-sampleというフォルダに保存してください。
そしたら、Rコンソール上で
> library(shinytest) > recordTest("./shinytest-sample")
と実行してください。
すると、下図のように右側にテスト用のUIが表示されています。
実行後、適当にスライダーを変化させながら保存したい状態で、「Take snapshot」をクリックしてください。
何度もスナップショットはとれるので、一通り保存したい状態を記録できたら「Save script and exit test event recorder」を押してください。こちらでテストに用いるスナップショット取得が終了します。
アプリケーションのソースコードが保存されている shinytest-sampleフォルダに戻ると、tests/ というフォルダが作成されているはずです。
このtestsフォルダには、どのようなスナップショットをとったかが、保存されています。
テストの実行
テストを実行したいときは、> testApp("shinytest-sample")
と実行します。
テストが無事通れば、
Running mytest.R
====== Comparing mytest ...
とコンソールに出力されます。
もし変更を加えていて、テストが落ちれば変化の箇所を表示してくれます。
はいー便利。
最後に
ということで、shinytestの導入方法から簡単な使い方について紹介しました。今回は、全てのinput要素をテストしましたが、実際にはテストを行う必要があるのは一部だけだったりします。
shinytestは、テストしたいinput要素だけをスナップショットとして保存することもできます。
そのような使い方については、また次回に紹介します。