Im sorry then - I just assumed the tool would exclude or note the difference there. Personally code test coverage I take with a grain of salt because most people can’t write correct tests to begin with, so I’m almost always looking as tests in the low level packages that are used upstream.
> On Mar 18, 2020, at 10:12 AM, Ondrej <ondrej.ko...@gmail.com> wrote: > > > 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> 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. >>>>> <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. >>> To view this discussion on the web visit >>> https://groups.google.com/d/msgid/golang-nuts/f355f9d5-2a06-4f32-bf6c-f21fe61928d3%40googlegroups.com. > > -- > 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. -- 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/E0C717EB-A60A-4746-B7AA-752B743E82C0%40ix.netcom.com.