R 单元测试闪亮的应用程序

R 单元测试闪亮的应用程序,r,testing,shiny,R,Testing,Shiny,因此,我一直在编写一个相当详细的闪亮应用程序,将来需要更新,因为运行的功能在不断变化 我需要能够做的是进行单元测试(使用testthat或其他对闪亮应用更有用的库),使我能够以更自动化的方式运行这些测试 我已经写了一个简单的闪亮的应用程序。为了进行测试,我想知道如果我在数字输入中选择数字20,那么我得到400作为输出$out文本。但我想在自己不运行应用程序的情况下做到这一点 library(shiny) ui <- fluidPage(title = 'Test App', n

因此,我一直在编写一个相当详细的闪亮应用程序,将来需要更新,因为运行的功能在不断变化

我需要能够做的是进行单元测试(使用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)
库(闪亮)

ui我在这里看到了两种可能的方法–测试底层功能,以及执行web应用程序本身的测试。注意,后者实际上需要运行服务器,但更准确地表示您的web应用程序是否工作

通过测试底层功能,我的意思是将您当前在服务器中执行的计算重构为它们自己的独立功能。您不应该直接在服务器中对数字进行平方运算,而应该将功能与服务器分开,以便对其进行测试。例如,像这样:

square_of_number <- function(n) return(n^2)
此外,如果您想测试应用程序本身,还可以在使用Shiny生成的实际UI上使用无头浏览器创建测试。评论中建议的一种方法是使用,但我建议尝试的一种方法是:

  • 使用特定端口运行服务器
  • 使用诸如或之类的工具连接此服务器以操作页面,然后刮取输出
  • 然后用所述方法验证所述输出

正如前面提到的,您可以将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()
库(shinytest)
图书馆(testthat)
上下文(“测试应用程序”)
#打开闪亮的应用程序

我相信你正在寻找的应用程序。请参见渐晕图
渐晕图(“shinytesting”、“RSelenium”)
。不过它似乎有一点学习曲线。谢谢,这看起来正是我需要的。只需要了解如何在工作时进入Selenium服务器!Selenium在技术上不是单元测试。我认为基本上,如果你想进行单元测试,你必须分解RShiny应用程序的功能,直到你可以简单地使用它testthat@ColinD我很想看一个例子来说明如何做到这一点,只是为了回答这个问题:)CI工具是另一种选择。这可能也是相关的。不幸的是,如果您处理的是闪亮的模块,那么这是无用的。
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()