2016-03-31 3 views
12

Итак, я пишу довольно подробное блестящее приложение, и в будущем вам потребуется обновление, так как функциональность за тем, что запускается, постоянно меняется.Unit Testing Shiny Apps

Что мне нужно, чтобы иметь возможность выполнять модульные тесты (используя testthat или другую библиотеку, более полезную для блестящих приложений), которая позволяет мне запускать эти тесты более автоматизированным способом.

Я написал простое блестящее приложение. Для тестирования в этом хотелось бы знать, что если я выберу число 20 в числовом вводе, тогда я получаю 400 в качестве выходного текста $ out. Но я хочу, чтобы это можно было сделать без собственно запуска приложения.

library(shiny) 

ui <- fluidPage(title = 'Test App', 
    numericInput('num', 'Number', 50, 1, 100, 0.5), 
    'Numeric output', 
    textOutput('out') 
) 

server <- function(input, output, session) { 
    aux <- reactive(input$num^2) 

    output$out <- renderText(aux()) 
} 

shinyApp(ui = ui, server = server) 
+3

Я считаю, что вы ищете [RSelenium] (https://cran.r-project.org/web/packages/RSelenium/). Смотрите виньетку «виньетка» («shinytesting», «RSelenium»). Хотя, похоже, у него есть немного кривая обучения. – cdeterman

+0

Спасибо, это похоже на то, что мне нужно. Просто нужно разобраться, как попасть на серверы Selenium во время работы! –

+3

Selenium не является технически модульным тестированием. Я думаю, что в принципе, если вы хотите модульное тестирование, вам нужно разложить функциональность приложения RShiny, пока вы не сможете просто использовать testthat –

ответ

0

Я вижу два возможных подходов здесь - тестирует основных функциональных возможностей и исполнительское испытания самого веб-приложения. Обратите внимание, что последний фактически потребует запуска сервера, но более точное представление о том, работает ли ваше веб-приложение или нет.

Проверяя базовую функциональность, я имею в виду реорганизацию вычислений, которые вы в настоящее время выполняете на сервере, для собственных независимых функций. Вместо того, чтобы квадратировать число непосредственно на сервере, вы должны отделить функциональность от сервера, чтобы его можно было протестировать. Например, вот так:

square_of_number <- function(n) return(n^2) 

Теперь вы можете отдельно протестировать square_of_number функцию ожидаемого выхода.

library('testthat') 

square_of_number <- function(n) return(n^2) 

expect_equal(square_of_number(4), 16) 

Кроме того, если вы хотите протестировать приложение себя, вы также можете создавать тесты с помощью обезглавленного браузера на фактическом UI можно создавать с Shiny. Один из способов, как предложено в комментариях используют Shinytest, но один подход, который я предлагаю попробовать это:

  • Запуск сервера с определенным портом,
  • Сопряжением этого сервера с помощью инструмента, как rvest или RSelenium к манипулировать страницей, а затем очистить выходной сигнал,
  • , затем проверив указанный вывод с помощью testthat.
1

Как уже упоминалось, вы можете использовать пакет shinytest в сочетании с testthat.

Вот простой пример:

library(shinytest) 
library(testthat) 

context("Test shiny app") 

#open shiny app 
app <- ShinyDriver$new('path_to_shiny_app') 

test_that("app gets expected output", { 
    #set numeric input 
    app$setInputs(num = 20) 
    #get output 
    output <- app$getValue(name = "out") 
    #test 
    expect_equal(output, "400") 
}) 

#stop shiny app 
app$stop()