[R-pkg-devel] Is using global assignment in package tests allowed?

Ben Bolker bbo|ker @end|ng |rom gm@||@com
Thu Jan 27 18:11:55 CET 2022



On 1/27/22 12:07 PM, Duncan Murdoch wrote:
> On 27/01/2022 11:18 a.m., Ben Bolker wrote:
>>     I will chime in briefly.
>>
>>     I have spent hours trying to understand the scoping behaviour of
>> testthat, mostly without success. I have lots of examples where I have
>> tests that fail *only* when running devtools::check(), but not when
>> running test_that in an interactive session, or in the same code run via
>> source() or in an R batch session.  So I am quite sympathetic to "beyond
>> my ken".
>>
>>     I agree that it's best to understand everything so that you can know
>> when you might run into trouble in the future, but I have sometimes
>> reconciled myself to giving up when it seemed I was spending much more
>> time debugging my tests than debugging the actual package code ...
>>
>>     For what it's worth, I have found that running <<- in these contexts
>> doesn't seem to bother CRAN at all -- possibly because it's the *tests*
>> that are potentially modifying the global environment, not the package
>> itself.
>>
>>     If you think about it, a prohibition on modifying the global
>> environment in tests would mean that a plain old test file that assigned
>> variables as part of testing flow would change the environment.
> 
> Yes, tests should be able to create variables, but they shouldn't go 
> overboard.  A test like
> 
>     x <- 1
>     stopifnot(x == 1)
> 
> will wipe out x, but that's probably not such a big deal.  On the other 
> hand, a test like
> 
>     c <<- function(...) stop('do not do this!')
>     testthat::expect_error(c(1))
> 
> is probably not a good idea.
> 
> Duncan Murdoch

   Fair enough.

   As to Dirk's comments about not being required to use a particular 
test platform, I'll just say: inertia/sunk costs. I will definitely 
consider using tinytest, or something else, in future projects ... (I do 
like some of the extra features offered by testing platforms over the 
base-R/vanilla "source() everything in the tests/ directory" approach.)

   cheers
     Ben Bolker
> 
>>
>> On 1/27/22 10:56 AM, James Pustejovsky wrote:
>>> But I am not using global variables at all in the package code (in
>>> /R)---only for unit testing. Is this distinction relevant? Or do I 
>>> need to
>>> avoid global assignment even in the unit tests?
>>>
>>> On Thu, Jan 27, 2022 at 9:40 AM Dirk Eddelbuettel <edd using debian.org> 
>>> wrote:
>>>
>>>>
>>>> On 27 January 2022 at 07:20, Jeff Newmiller wrote:
>>>> | I don't know the answer to your question, but "beyond my ken" doesn't
>>>> sound like a very convincing reason. Mucking with any environment that
>>>> isn't yours is asking for trouble... the behavior you depend on 
>>>> today may
>>>> come into conflict with the code you are coordinating with when you 
>>>> least
>>>> expect it.
>>>>
>>>> Right on.
>>>>
>>>> Yes a number of packages (of mine and other people) use a different
>>>> approach
>>>> to maintain 'global state' without ... using 'global variables' (== 
>>>> bad).
>>>>
>>>> The trick is something like `pkgenv <- new.env()` in R/zzz.R and to 
>>>> then
>>>> also
>>>> set an option or two you need in .onLoad as eg  
>>>> `pkgenv[["prefence"]] <-
>>>> "foo"`
>>>> which you can later test for, alter, ... at will.
>>>>
>>>> All without running afould of what `R CMD check --as-cran` may hate, 
>>>> all
>>>> the
>>>> while maintaining your logic flow.
>>>>
>>>> Dirk
>>>>
>>>> -- 
>>>> https://dirk.eddelbuettel.com | @eddelbuettel | edd using debian.org
>>>>
>>>
>>>     [[alternative HTML version deleted]]
>>>
>>> ______________________________________________
>>> R-package-devel using r-project.org mailing list
>>> https://stat.ethz.ch/mailman/listinfo/r-package-devel
>>
> 

-- 
Dr. Benjamin Bolker
Professor, Mathematics & Statistics and Biology, McMaster University
Director, School of Computational Science and Engineering
(Acting) Graduate chair, Mathematics & Statistics



More information about the R-package-devel mailing list