But they are callable - I'm only doing this for exported functions and 
methods - as I described in the initial post (and the implementation).

On Wednesday, 18 March 2020 15:15:30 UTC+1, Robert Engels wrote:
>
> Exactly, but unless those functions are externally callable there is no 
> reason to test them in isolation. 
>
> On Mar 18, 2020, at 9:04 AM, Ondrej <ondre...@gmail.com <javascript:>> 
> wrote:
>
> 
> That omission is not really relevant. Even if I included an assertion in 
> the test, it wouldn't affect the point I am making. I just wanted to have 
> at least some source code to reproduce the problem - adding if 
> Calculator(1,2) != 3 {t.Error(...)} would make it more of a complete test, 
> but my point is entirely different. My point is that top level functions 
> calling further functions leads to "inflated" coverage numbers, because I 
> am explicitly not testing any of the downstream functionality, just the top 
> level function.
>
> Again, this is not really a technical issue.
>
> On Wednesday, 18 March 2020 13:29:05 UTC+1, Robert Engels wrote:
>>
>> It’s because you are not writing the top level test correctly - there is 
>> no testing at all !
>>
>> On Mar 18, 2020, at 7:02 AM, Ondrej <ondre...@gmail.com> wrote:
>>
>> 
>> Hey!
>>
>> There's an issue I've been grappling with for ages - say I have a custom 
>> function, Print, that calls six other functions, FormatString, FormatBool, 
>> FormatXYZ, ..., and I have no tests. Once I write some basic tests for 
>> Print, it does call some of the other functions and from looking at my test 
>> coverage, it looks like I have those nested functions covered, but I never 
>> called them explicitly, I never did try all their corner cases, did not 
>> fuzz them or anything.
>>
>> It may sound odd or not important, but I have encountered this in almost 
>> every project in Go and other languages - the setup is always the same - 
>> lots of small functions doing their thing and then some orchestrator that 
>> integrates everything (could be a cli, could be an endpoint etc.) and once 
>> I set that up, coverage spikes up.
>>
>> Here's a simple example:
>>
>> // calculator.go
>> package calculator
>>
>> func Add(a, b int) int {
>> return a+b
>> }
>>
>> func Calculator(a, b int) int {
>> return Add(a, b)
>> }
>>
>> // calculator_test.go
>> package calculator
>>
>> import "testing"
>>
>> func TestCalculator(t *testing.T) {
>> s := Calculator(1, 2)
>> _ = s
>> }
>>
>> In this case, Calculator is covered, and so is Add, but I never tested 
>> how Add behaves for values close to the int maximum and with other 
>> potentially dangerous edge cases.
>>
>> I've though about this over the years a tiny bit and never really found a 
>> great solution, because it's not really a technical thing, it's more about 
>> the workflow and attitude to testing.
>>
>> I prototyped a simple tool that looks up all the exported functions and 
>> methods in a package and then checks if they are *explicitly* called in our 
>> tests. This does not guarantee anything, but at least we know they were 
>> explicitly used, not indirectly called within a different function. The 
>> prototype does not quite work for methods, because I got kind of lost in 
>> the go/{parser,ast} indirections. Also reassigning functions as first class 
>> values and then calling them from a different variable will probably also 
>> break it.
>>
>> So it does give a lot of false positives for methods, but should be 
>> mostly fine for functions.
>>
>> While it probably does not solve any problems for any people apart from 
>> me, I'll try and fix the method issues, because I do really need it for my 
>> own test writing.
>>
>> Do let me know if there's a better solution to this or if you've 
>> encountered this and have some thoughts on the topic.
>>
>> Thanks!
>>
>> Ondrej
>>
>> -- 
>> You received this message because you are subscribed to the Google Groups 
>> "golang-nuts" group.
>> To unsubscribe from this group and stop receiving emails from it, send an 
>> email to golan...@googlegroups.com.
>> To view this discussion on the web visit 
>> https://groups.google.com/d/msgid/golang-nuts/73963c74-bdde-4b22-8d59-cdce458e2877%40googlegroups.com
>>  
>> <https://groups.google.com/d/msgid/golang-nuts/73963c74-bdde-4b22-8d59-cdce458e2877%40googlegroups.com?utm_medium=email&utm_source=footer>
>> .
>> <main.go>
>>
>> -- 
> You received this message because you are subscribed to the Google Groups 
> "golang-nuts" group.
> To unsubscribe from this group and stop receiving emails from it, send an 
> email to golan...@googlegroups.com <javascript:>.
> To view this discussion on the web visit 
> https://groups.google.com/d/msgid/golang-nuts/f355f9d5-2a06-4f32-bf6c-f21fe61928d3%40googlegroups.com
>  
> <https://groups.google.com/d/msgid/golang-nuts/f355f9d5-2a06-4f32-bf6c-f21fe61928d3%40googlegroups.com?utm_medium=email&utm_source=footer>
> .
>
>

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/golang-nuts/f670f356-b7af-47bb-a3c0-76ee3df9b62e%40googlegroups.com.

Reply via email to