devtools::test() 并行?

devtools::test() in parallel?

我有一个使用 testthat 的测试套件,其中包含 R/tests 中的多个文件,我想并行测试它们以加快测试速度。 devtoolstestthat 或其他地方是否有实现此目的的方法?

我尝试使用 future 包“手动”执行此操作,但 stdout 的文本呈现不可读:

# Get a vector of test files without "test-" and ".R"
test_files = list.files("tests/testthat", "test-")
test_filters = stringr::str_replace_all(test_files, c("test-|\.R"), "")

# Run test for each file in parallel
future::plan(future::multiprocess)
future.apply::future_mapply(devtools::test, filter = test_filters)

根据 RUnit 的长期用户最近切换到 tinytest 的警告,您正在寻找的功能已经存在于 tinytest 中。我认为有人已经或可能会在某个时候为 testthat 构建一个并行测试 运行ner,但在 'here and now' 中我们确实有 tinytest 具有非常好的行为,很好从 RUnittestthat.

转换的文档和线索

我最喜欢 tinytest 的功能是包中默认安装测试、缺少其他依赖项和并行 运行ner。

还有一个警告:与 R 提示符相比,我更喜欢这个 的命令行 因为可能总会有某种形式的副作用。所以我加了一点测试 运行ner wrappre tt.r to littler:

edd@rob:~$ tt.r -h
Usage: tt.r [-h] [-x] [-a] [-b] [-d] [-f] [-n NCPUS] [-p] [-s] [-z] [ARG...]

-a --all            use test_all mode [default: FALSE]
-b --build          use build-install-test mode [default: FALSE]
-d --directory      use directory mode [default: FALSE]
-f --file           use file mode [default: FALSE]
-n --ncpus NCPUS    use 'ncpus' in parallel [default: getOption]
-p --package        use package mode [default: FALSE]
-s --silent         use silent and do not print result [default: FALSE]
-z --effects        suppress side effects [default: FALSE]
-h --help           show this help text
-x --usage          show help and short example usage 
edd@rob:~$ 

(我应该在这里补充一点,由于 docopt,编写这样的包装器很容易。)

然后我们简单地做

edd@rob:~$ tt.r -n 4 -p anytime
starting worker pid=642068 on localhost:11092 at 17:11:25.636
starting worker pid=642067 on localhost:11092 at 17:11:25.654
starting worker pid=642065 on localhost:11092 at 17:11:25.687
starting worker pid=642066 on localhost:11092 at 17:11:25.689
Running test_gh_issue_12.R............    2 tests OK 
Running test_gh_issue_56.R............    7 tests OK 
Running test_gh_issue_33.R............    2 tests OK 

Running test_all_formats.R............    0 tests    ris or Windows or Release
Running test_assertions.R.............    2 tests OK 
Running test_calc_unique.R............    4 tests OK 
Running test_gh_issue_100.R...........    2 tests OK 
Running test_simple.R.................   34 tests OK 
Running test_utilities.R..............    2 tests OK 
Running test_bulk.R................... 2328 tests OK 
[1] "All ok, 2383 results"
edd@rob:~$ 

你看到有一点输出被吞没了。

你当然也可以 运行 手工从 R:

R> tinytest::test_package("anytime", ncpu=4)
starting worker pid=651865 on localhost:11762 at 17:14:45.970
starting worker pid=651864 on localhost:11762 at 17:14:45.980
starting worker pid=651863 on localhost:11762 at 17:14:45.980
starting worker pid=651862 on localhost:11762 at 17:14:45.984
Running test_gh_issue_12.R............    2 tests
 Exited 'test_all_formats.R' at line 24. Skipping Solaris or Windows or ReleaseOK 
Running test_all_formats.R............    0 tests    
Running test_gh_issue_56.R............    7 tests OK 
Running test_assertions.R.............    2 tests OK 
Running test_gh_issue_33.R............    2 tests OK 
Running test_calc_unique.R............    4 tests OK 
Running test_gh_issue_100.R...........    2 tests OK 
Running test_simple.R.................   34 tests OK 
Running test_utilities.R..............    2 tests OK 
Running test_bulk.R................... 2328 tests OK 
[1] "All ok, 2383 results"
R> 

文件目录、构建+安装+测试周期等还有其他运行程序。嘿,如果在这一切之后你仍然不喜欢它,马克会把钱还给你:)

PS 在这里和例如 Rcpp 我有一些测试“变暗”,因为它们会产生大量的 cmdline 噪音,所以只有在设置了 opt-in var 时才会在包测试中发生.因此上面的几个'zero tests run'。这是我的设置,不是 tinytest 问题。