I like your thinking. Replacing UTs with asserts sounds pretty interesting
to me. Let me give a good thought about it. There's clearly enormous
potential, but there's also potentially many unforeseen implications. But
we should continue this discussion offline or in a separate thread. I have
duly noted your suggestion. :-)

On Mon, Nov 26, 2018 at 12:48 PM robert engels <reng...@ix.netcom.com>
wrote:

> If you re-read what you wrote you will see the problem - you weren’t
> setting a prev/next link correctly - the proper way test test these
> invariants IMO is to use asserts within the implementation itself - that
> way the implementation change change without breaking all of the tests.
> Otherwise code is impossible to refactor - as you need to “determine the
> design” by reading very low-level unit tests - when I review your unit
> tests they tell me me nothing explicitly about the design - I have to
> “figure that out”… not good.
>
> In many ways, your unit tests present more complex/obscure logic to
> understand than the code itself…
>
> I’ll repeat, I can’t find any “unit tests” of that type in the Go stdlib,
> and reviewing the ones I do find (not in a different _test package) it
> seems it was a mistake, as they still only exercise the public API  -
> that’s a hint to me that you are doing something wrong.
>
>
>
> On Nov 26, 2018, at 2:34 PM, Christian Petrin <christianpet...@gmail.com>
> wrote:
>
> It's funny because I'm not a big fan of unit testing for all the same
> reasons you mentioned. Impl7
> <https://github.com/christianrpetrin/queue-tests/blob/master/queueimpl7/queueimpl7_test.go>,
> for instance, I didn't implement any unit tests as the implementation was
> very simple and integration tests is sufficient.
>
> With deque, I initially implemented just integration tests. They were all
> passing and deque was behaving, according to the tests, correctly, always
> returning the expected results. When I deemed to have finalized the
> implementation (checking its correctness via integration tests), the deque
> was not performing as expected in a number of test scenarios. That caused
> me to scratch my head pretty hard for a good deal of time until I realized
> there was nothing wrong with the design. There should have some issue with
> the implementation. I tried my best to find out where the problem was, but
> failed. So I realized I should implement unit tests to make sure the
> implementation was not only correct, but follows the design perfectly.
>
> With the UTs, I was able to find the bug. A very sneaky one where I was
> not setting a link (prev/next) correctly, and that caused the deque to not
> use the spare links when the design dictate the deque should. Even with the
> bug, the queue was performing correctly, but not efficiently.
>
> In any case, my point is a well validated implementation should have tests
> at all levels (unit, integration, API, e2e) as some bugs can only be
> discovered with some types of tests.
>
> On Mon, Nov 26, 2018 at 10:09 AM robert engels <reng...@ix.netcom.com>
> wrote:
>
>> I am just offering, and many would disagree, that unit tests that like
>> are brittle and not worthwhile. I don’t see them in the Go stdlib for major
>> packages, but I could be wrong.
>>
>> My thought on this is that if you are testing the nitty details of the
>> implementation, you need to get that “correct” twice - and if it is
>> failing, you don’t really know which one is wrong… This is especially
>> problematic as things are refactored - all of those types of tests break.
>>
>> I’m of the opinion - test the behavior comprehensively, and expose the
>> expected usage (and corresponding design) there.
>>
>> On Nov 26, 2018, at 11:58 AM, Christian Petrin <christianpet...@gmail.com>
>> wrote:
>>
>> Hi Robert,
>>
>> the deque has unit, integration and API tests. The unit tests, I agree,
>> are hard to follow as they have to check all internal properties to make
>> sure the code is doing what it is supposed to do (keep a well formed ring
>> linked list during all steps). Given their nature (unit tests), the only
>> way to access the internal deque variables is to have them in the same
>> package.
>>
>> Regarding the other, API and integration tests, I agree 100%. They should
>> be in the dequeue_test package as they are not supposed to access (or know
>> of) any of the deque internal variables. I'll move these tests to a
>> different file in the dequeue_test package.
>>
>> Really appreciate the suggestion (correction, really).
>>
>> Thanks,
>> Christian
>>
>>
>>
>>
>> On Mon, Nov 26, 2018 at 9:42 AM robert engels <reng...@ix.netcom.com>
>> wrote:
>>
>>> Just an FYI, IMO your testing is incorrect.
>>>
>>> Your tests should be in a package dequeue_test so that they cannot
>>> access the internal details. This makes them brittle and hard to follow.
>>>
>>> For reference, look at the Go stdlib sync/map.go and sync/map_test.go.
>>> All of the tests are in sync_test for all of the structs/methods.
>>>
>>>
>>> On Nov 26, 2018, at 10:59 AM, Christian Petrin <
>>> christianpet...@gmail.com> wrote:
>>>
>>> Hello,
>>>
>>> I'm working on a logging system called CloudLogger
>>> <https://github.com/cloud-logger/docs> and to cut to the chase,
>>> CloudLogger needs an unbounded in-memory queue. The idea is to use the
>>> queue as a sequential data store. As there's no telling beforehand how much
>>> data will need to be stored, the queue has to be able to scale to support
>>> large amounts of data, so CloudLogger needs an unbounded queue, a very fast
>>> and efficient one.
>>>
>>> Noticing Go doesn't offer an unbounded queue implementation, I came up
>>> with an idea to build a queue based on linked slices.
>>>
>>> I was so impressed with the results that I decided to spend some time
>>> researching about other queue designs and ways to improve it. I'm finally
>>> done with the research and I feel like the new queue is worth being
>>> considered to be part of the standard library.
>>>
>>> So please take a look at the issue. All suggestions, questions,
>>> comments, etc are most welcome!
>>>
>>> Due to many suggestions, I have deployed the deque as a proper external
>>> package. In order to help validate the deque and get it into the standard
>>> library, I need to somehow get people to start using it. If you are using a
>>> queue/stack/deque, please consider switching to the new deque. Also if you
>>> know someone who is using a queue/stack/deque, please let them know about
>>> the deque.
>>>
>>> I'm extremely interested in improving the queue and I love challenges.
>>> If you suspect there's a possibly better design or a better, more
>>> performant and balanced deque implementation out there, please let me know
>>> and I'm very glad to benchmark it against deque.
>>>
>>> Proposal: https://github.com/golang/go/issues/27935
>>> Deque package: https://github.com/ef-ds/deque
>>>
>>> Thanks,
>>> Christian
>>>
>>> --
>>> 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.
>>> For more options, visit https://groups.google.com/d/optout.
>>>
>>>
>>>
>>
>> --
>> Thanks,
>> Christian
>>
>>
>>
>
> --
> Thanks,
> Christian
>
> --
> 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.
> For more options, visit https://groups.google.com/d/optout.
>
>
>

-- 
Thanks,
Christian

-- 
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.
For more options, visit https://groups.google.com/d/optout.

Reply via email to