【问题标题】:Automatically test if shiny crashes and retrieve error?自动测试闪亮的崩溃并检索错误?
【发布时间】:2022-06-30 22:27:49
【问题描述】:

我有一个这样的应用:

library(shiny)

ui <- fluidPage(
    mainPanel(
        textOutput("Query_String")
    )
)

server <- function(input, output, session) {
    observeEvent(session$clientData$url_search,{
        Query <- session$clientData$url_search
        output$Query_String <- renderText(Query)
        # Long list of operations dependant on the parameters passed in the URL
    })
}

shinyApp(ui = ui, server = server)

这需要一个 URL 查询作为参数。 我有一个列表,其中包含大约 5000 个条目,其中包含应用程序应接受的所有可能查询 我可以通过这样的方式调用应用程序来运行应用程序迭代查询:

runApp(
  appDir = "R",
  port = 3838,
  launch.browser = function(appUrl) {
    url <- paste0(appUrl, "/?query")
    invisible(.Call("rs_shinyviewer", url, getwd(), "browser", NULL, PACKAGE = "(embedding)"))
  },
  host = "0.0.0.0"
)

现在我的问题是:
如何发现哪些查询可能导致应用崩溃?
我尝试用大tryCatch() 将逻辑包装在服务器内部,但这显然没有做任何事情,也没有用tryCatch() 包装runApp()(尽管这对我来说很有意义)。
想法?

【问题讨论】:

  • 崩溃与异常不同。 tryCatch() 捕获异常。如果应用程序崩溃了,它就不能再运行任何代码了。我认为您需要确定导致崩溃的条件并在失败发生之前防止失败。
  • 感谢您了解为什么 tryCatch() 方法不起作用,这很有意义!我显然可以使用tryCatch() 包装可能导致应用程序内部崩溃的位来执行您的建议,但是我想知道上述方法是否可行,以便进行粗略的第一次检查以识别极端情况以意想不到的方式与应用交互的查询。
  • 在每个查询结束时,打印一个诊断信息。类似于“已完成查询 XXXX”。如果您知道查询运行的顺序,那将告诉您导致崩溃的(第一个)查询。实施修复。重复直到满意。 logger 包(或类似包)可能会有所帮助。

标签: r exception shiny


【解决方案1】:

测试闪亮的应用程序是否在启动时崩溃

testthat::test_that("server launches",{
local_edition(3)
skip_on_cran()
skip_on_travis()
skip_on_appveyor() 
app <- shinytest::ShinyDriver$new(here::here()) #open shiny app

a <- data.frame(app$getDebugLog()) #check debug log for error

a <- a %>%  
  filter(!grepl('Warning: ', message)) %>% filter(level == "ERROR") 

if (length(grep("Error in", a)) == 0) 
  alive = TRUE
 else 
  alive = FALSE 
expect_true(alive) })

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-28
    • 2015-10-05
    • 2020-11-13
    • 2015-12-09
    • 1970-01-01
    • 2020-05-27
    • 1970-01-01
    • 2016-05-20
    相关资源
    最近更新 更多