Групповое тестирование блестящих приложений

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

Что мне нужно, чтобы иметь возможность выполнять модульные тесты (используя 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)

Ответ 1

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

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

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)

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

  • Запуск сервера с определенным портом,
  • Взаимодействие с этим сервером с помощью инструмента rvest или RSelenium, чтобы манипулировать страницей, а затем очистить вывод,
  • затем проверив указанный вывод testthat.