to manually test a huge number of new features... • and old ones to avoid regressions. • Developers will fix bugs as soon as the tester reports them, then he should have to start all tests from scratch to the new release candidate - but he won’t!
pressure, so he will work hard. His error rate will increase. • The tester will have to make assumptions about the configuration that will be used for the certification process. • The same for developers. • In the shuffling madness of this project, everybody feels like the all-time loser, headlong to the project’s death.
to work with! • Software was never actually release ready. • During these two weeks, the tester has filed several bug reports. Developers fixed bugs and made another release candidate, so the tester has actually tested the final release for few hours...
their modification because installing the software was too hard and slow. • So they always were working in an environment totally different from production. • And anyway, they had no discipline to take track of what tests needed to do, just a fast smoke test before committing to SVN.
test new features disregard regressions. • So, developers were busy fixing bugs as they came out during the certification phase! • After that, everybody enjoyed the art of avoiding responsability of failures. What went wrong? (3)
the art of avoiding responsibilities of failures. • Some agreed it was the consultant’s fault. Yes, the one who left one year before. • Some scheduled to work 12 hours everyday to fix everything they found before next certification phase. • None of them understood the situation.
do, do it more often. Until you will automate it. • No exception to this rule! • IT is about automation. You help other persons to automate their work and to increase productivity, but you don’t do that for yourself, do you? • That does not sound very smart!
tests than test manually! • More code to be written… but they will speed up maintenance. • Nothing can’t be really tested: programs are useful as they produce output, not for their hidden status. • Don’t forget to automate installation and database management.
• Features: ◦ Every push trigger a build ◦ Feedbacks arrives in minutes ◦ A broken build needs priority to be fixed ◦ One does not simply @Ignore a failing test ◦ Static code analysis (smells, duplicated lines, …) ◦ Trendy Graphs!
framework. Otherwise unit testing can be impossible. • Component tests with database access. • Integration tests againt *real* components. • Everything must run in less than 8 minutes. • Use a database configuration optimized for tests.
with dynamic languages. • Test slices of code in isolation. • Use mocking or stubs to simulate external interaction. • Avoid the database! • Must be very fast.
database access anyway. It’s where most bugs live! • Use a meaningful small subset of your production database for each test. • Isolate database between each test, transaction can be useful. (DBUnit)
interact together. • Database and network access are a must. • Slower and harder to write. • A reason to keep interfaces between modules simple and extensible, and generally better.