Re: Long running test suite
"Kim Gräsman [email protected] [testdrivendevelopment]" <[email protected]> Fri, 10 Jun 2016 08:00:58 +0200
| Newsgroups | gmane.comp.programming.test-driven-development |
|---|---|
| Message-ID | <CANt7B+ezDJiHnNbsa=Xm0sp=mwoioYJyAaavmr-Kre+=gBx7KQ@mail.gmail.com> |
Hi John, all, > I test for threading nasties by structuring things so I can explicitly trigger _every_ > possible event sequence order and verify it works. I've seen several test suites where people force execution order on multithreaded SUTs (using test-only synchronization points), effectively creating a programmatic single-step debugger. It's not pretty. But it sounds like you're talking more about decoupling testable logic from the threads that drive it, and only test the logic? I like that better. > I have some subsystem tests, which are _not_ part of the unit test suite which I > leave running for as long as I want to hunt for cases I may have missed..... The Google LLVM crowd are doing lots of interesting stuff for C++ here. Assuming you have a high-level test suite driving the whole program, they provide compiler-supported dynamic analysis to expose threading bugs at runtime, e.g.: http://clang.llvm.org/docs/ThreadSanitizer.html http://clang.llvm.org/docs/AddressSanitizer.html http://jefftrull.github.io/c++/clang/llvm/fuzzing/sanitizers/2015/11/27/fuzzing-with-sanitizers.html So the combination of low-level 100% stable unit tests, and driving the (instrumented) application at a high-leve, maybe with fuzzed input to expose flaky behavior is really compelling. It's fun to see that C++ has such elaborate infrastructure, I don't know if the same kind of machinery is readily available for other languages/environments. Then again, maybe those languages/environments don't encourage those kinds of bugs :-) - Kim On Fri, Jun 10, 2016 at 3:20 AM, John Carter [email protected] [testdrivendevelopment] <[email protected]> wrote: > > > > In fact, it ought to be possible to surrender all control of ordering > and parallelism to the runner. > > Part of me says, "Any code that depends on the exact performance of the > scheduler, the load the number of CPU's, .... is flaky, I want my tests to > break and tell me so." > > "Any suit of tests that depend on order of execution to work has destroyed > the value of defect localization (ie. Which test breaks tells you which > part of the code is broken)" > > So part of me says you are right. > > However watching the behaviour of the herd of cats I work with....flaky > sporadic failing tests are a human process level disaster. > > Tests that fail for any other reason other than the last checkin, results > in dilution of responsibility and ever growing flakiness. > > ie. Unit tests suit must be 100% deterministic and reproducible, and we > must use other techniques to hunt threading / ordering issues. > > Processes are very nice in the sense that they completely clean up at the > OS level. I use valgrind to enforce that.... > > 1) Every Unit Under Test initialises everything it should. > 2) Doesn't leak any resources (all _must_ be collected by test process > exit point) > > I test for threading nasties by structuring things so I can explicitly > trigger _every_ possible event sequence order and verify it works. > > I have some subsystem tests, which are _not_ part of the unit test suite > which I leave running for as long as I want to hunt for cases I may have > missed..... > > If I find one I encode it as an explicit ordering in a unit test. > > > > On Tue, Jun 7, 2016 at 2:27 PM, Charlie Poole [email protected] > [testdrivendevelopment] <[email protected]> wrote: > >> >> >> Hi John, >> >> I like your list of ideas, but I take a small exception with your comment >> about running tests on multiple threads. >> >> I agree that it sometimes introduces non-deterministic results, but >> that's generally due to faults in the tests. Ideally, it should be possible >> to run any set of unit tests (i.e. microtests) in random order on parallel >> threads. In fact, it ought to be possible to surrender all control of >> ordering and parallelism to the runner. I grant that this is a hard goal to >> achieve. >> >> Charlie >> >> On Mon, Jun 6, 2016 at 6:38 PM, John Carter [email protected] >> [testdrivendevelopment] <[email protected]> wrote: >> >>> >>> >>> Things I do to handle this.... >>> >>> * Benchmark. Every build spits out an order list of how long each test >>> took. Attack the long ones first. >>> * Parallelism via Processes not threads. Multithreaded unit testing is a >>> recipe for non-determinism and flakiness. >>> * No sleep rule. Find every test with a "sleep" in it and fix it. >>> Sleeps, delays, timeouts are test smells of the first order. >>> * Unreal time. Wrap all time services and create a test interface that >>> allows you to "roll time forward" and trigger all events in order. >>> * Some tests want to be able to run for days to get better state space >>> coverage. Make that a "developer only" option. Run a tiny / fast subset for >>> unit test checkin coverage and let developer run exhaustive test himself >>> when needed. >>> >>> >>> On Mon, May 23, 2016 at 3:25 PM, Joselito D Moreno [email protected] >>> [testdrivendevelopment] <[email protected]> wrote: >>> >>>> >>>> >>>> Hello, >>>> >>>> To those who have experienced test suites that run long, say ~25 >>>> minutes, what are some techniques you have used to mitigate it? We still >>>> would like to be able to check in often and run the test suites prior to >>>> checking our code in to our repository but these long running tests makes >>>> us stretch what we mean with "often". >>>> >>>> Joen >>>> >>>> __._, >>>> >>>> >>> >>> >>> -- >>> John Carter Phone : (64)(3) 358 6639 >>> Tait Electronics Fax : (64)(3) 359 4632 >>> PO Box 1645 Christchurch Email : >>> [email protected] >>> New Zealand >>> >>> >>> ------------------------------ >>> This Communication is Confidential. We only send and receive email on the >>> basis of the terms set out at www.taitradio.com/email_disclaimer >>> ------------------------------ >>> >>> >> > > > -- > John Carter Phone : (64)(3) 358 6639 > Tait Electronics Fax : (64)(3) 359 4632 > PO Box 1645 Christchurch Email : [email protected] > New Zealand > > > ------------------------------ > This Communication is Confidential. We only send and receive email on the > basis of the terms set out at www.taitradio.com/email_disclaimer > ------------------------------ > > > >