`devtools :: test ()`, `RNGversion` и` sample` дают разные результаты - PullRequest
0 голосов
/ 13 мая 2019

Ниже я представляю проблему с функцией тестирования Rstudio. Это упрощенная версия того, что я делаю в пакете. Я, конечно, сделал что-то не так, но я не могу понять, что. Я обнаружил это, когда начал вносить изменения в пакет на CRAN. Некоторые тесты внезапно не прошли в Rstudio, но сделали с R CMD check.

Чтобы увидеть проблему, создайте новый пакет с Rstudio и наберите usethis::use_test(). Затем отредактируйте tests/testthat.R, чтобы файл был

library(testthat)
library(<name-of-package>)

suppressWarnings(RNGversion("3.5.0"))

test_check("<name-of-package>")

Далее перейдите в tests/testthat/test-hello.R и измените его на

set.seed(1)
rnorm(1)

test_that("seed is the same",
          expect_known_value(.Random.seed, "the-seed.RDS"))

test_that("sample is the same",
          expect_known_value(sample(100), "sample.RDS"))

Создайте пакет и затем запустите devtools::test() три раза. Первый раз создает ссылочные значения. Второй раз дает

devtools::test()
#R Loading <name-of-package>
#R Testing <name-of-package>
#R ✔ |  OK F W S | Context
#R ✖ |   1 1     | hello
#R ──────────────────────────────────────────────────────────────────────
#R ???: failure: sample is the same
#R sample(100) has changed from known value recorded in 'sample.RDS'.
#R 100/100 mismatches (average diff: 37.1)
#R [1] 39 - 76 == -37
#R [2]  1 - 39 == -38
#R [3] 34 - 24 ==  10
#R [4] 87 - 53 ==  34
#R [5] 43 - 92 == -49
#R [6] 14 - 86 == -72
#R [7] 82 - 40 ==  42
#R [8] 59 - 83 == -24
#R [9] 51 - 90 == -39
#R ...
#R ──────────────────────────────────────────────────────────────────────
#R 
#R ══ Results ═══════════════════════════════════════════════════════════
#R OK:       1
#R Failed:   1
#R Warnings: 0
#R Skipped:  0

и отменяет результаты теста. Все проходит в третий раз. Выполнение тестов через Rstudio с Build> More> Test Package не приводит к сбоям. Далее перейдите в консоль, затем в родительский каталог и запустите

R CMD build <name-of-package>
R CMD check <name-of-package>_0.1.0.tar.gz

Последнее дает следующее testthat.Rout.fail

#R R version 3.6.0 (2019-04-26) -- "Planting of a Tree"
#R Copyright (C) 2019 The R Foundation for Statistical Computing
#R Platform: x86_64-pc-linux-gnu (64-bit)
#R 
#R R is free software and comes with ABSOLUTELY NO WARRANTY.
#R You are welcome to redistribute it under certain conditions.
#R Type 'license()' or 'licence()' for distribution details.
#R 
#R R is a collaborative project with many contributors.
#R Type 'contributors()' for more information and
#R 'citation()' on how to cite R or R packages in publications.
#R 
#R Type 'demo()' for some demos, 'help()' for on-line help, or
#R 'help.start()' for an HTML browser interface to help.
#R Type 'q()' to quit R.
#R 
library(testthat)
library(<name-of-package>)

suppressWarnings(RNGversion("3.5.0")) 

test_check("<name-of-package>")
#R ── 1. Failure: seed is the same  ─────────────────────────────────────
#R `.Random.seed` has changed from known value recorded in 'the-seed.RDS'.
#R 1/626 mismatches
#R [1] 403 - 10403 == -10000
#R 
#R ── 2. Failure: sample is the same  ────────────────────────────────────
#R sample(100) has changed from known value recorded in 'sample.RDS'.
#R 99/100 mismatches (average diff: 36.6)
#R [1] 58 - 39 ==  19
#R [2] 90 -  1 ==  89
#R [3] 20 - 34 == -14
#R [4] 88 - 87 ==   1
#R [5] 91 - 43 ==  48
#R [6] 63 - 14 ==  49
#R [7] 60 - 82 == -22
#R [8]  6 - 59 == -53
#R [9] 19 - 51 == -32
#R ...
#R 
#R ══ testthat results  ═════════════════════════════════════════════════
#R OK: 0 SKIPPED: 0 WARNINGS: 0 FAILED: 2
#R 1. Failure: seed is the same 
#R 2. Failure: sample is the same 
#R 
#R Error: testthat unit tests failed
#R Execution halted

Перезапуск Rstudio и запуск

setwd("tests")
source('path/to/package/<name-of-package>/tests/testthat.R')

Выход такой же, как R CMD check. То, что я получаю с R CMD check и получая файл testthat.R в моем исходном пакете, совпадает со старыми ссылочными значениями. Таким образом, похоже, что что-то происходит с devtools::test(). Вот мой sessionInfo()

R version 3.6.0 (2019-04-26)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Ubuntu 18.04.2 LTS

Matrix products: default
BLAS:   /usr/lib/x86_64-linux-gnu/blas/libblas.so.3.7.1
LAPACK: /usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3.7.1

Random number generation:
 RNG:     Mersenne-Twister 
 Normal:  Inversion 
 Sample:  Rounding 

locale:
 [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C              
 [3] LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8    
 [5] LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8   
 [7] LC_PAPER=en_US.UTF-8       LC_NAME=C                 
 [9] LC_ADDRESS=C               LC_TELEPHONE=C            
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C       

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods  
[7] base     

other attached packages:
[1] <name-of-package>_0.1.0 testthat_2.1.1  

loaded via a namespace (and not attached):
 [1] compiler_3.6.0   assertthat_0.2.1 magrittr_1.5    
 [4] R6_2.4.0         cli_1.1.0        tools_3.6.0     
 [7] withr_2.1.2      rstudioapi_0.10  yaml_2.2.0      
[10] crayon_1.3.4     rlang_0.3.4  

Обновление

Предлагаемое решение здесь состоит в том, чтобы создать файл, который идет в алфавитном порядке первым, чем все тесты в tests/testthat (таким образом, он будет запущен первым, см. ?testthat::source_file).

Так что ошибку можно исправить, повторив шаги в моем вопросе и заменив

Затем отредактируйте tests / testthat.R так, чтобы файл был

library(testthat)
library(<name-of-package>)

suppressWarnings(RNGversion("3.5.0"))
test_check("<name-of-package>")

с созданием файла tests/testthat/helper.R с этим содержимым

suppressWarnings(RNGversion("3.5.0"))

По какой-то причине это все равно дает другой результат между первым и вторым вызовом devtools::test(), но теперь все остальное дает то же самое. Выход из второго devtools::test() вызова

devtools::test()
#R Loading wtfpackage
#R Testing wtfpackage
#R ✔ |  OK F W S | Context
#R ✖ |   1 1     | hello
#R ────────────────────────────────────────────────────────────────────
#R ???: failure: sample is the same
#R sample(100) has changed from known value recorded in 'sample.RDS'.
#R 99/100 mismatches (average diff: 34.6)
#R [1] 58 - 28 ==  30
#R [2] 90 - 99 ==  -9
#R [3] 20 - 63 == -43
#R [4] 88 - 21 ==  67
#R [5] 91 - 13 ==  78
#R [6] 63 - 46 ==  17
#R [7] 60 - 87 == -27
#R [8]  6 - 56 == -50
#R [9] 19 - 90 == -71
#R ...
#R ────────────────────────────────────────────────────────────────────
#R 
#R ══ Results ═════════════════════════════════════════════════════════
#R OK:       1
#R Failed:   1
#R Warnings: 0
#R Skipped:  0
...