test-driven development - pvv.orgoma/tddbowlinggamekata.pdf · 2011. 5. 30. · olve maudal...
TRANSCRIPT
![Page 1: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/1.jpg)
Olve Maudal Test-Driven Development January 2007
(frontpage)
Test-Driven Development A Powerful Design and Programming Technique
... or The Bowling Game Kata in C++/QUnit
Olve Maudal , [email protected]
This is a modified version of an internal talk given at TANDBERG TechZone, Lillehammer 2007. Feel free to use this material for whatever you want.
(19. January 2007)
![Page 2: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/2.jpg)
Olve Maudal Test-Driven Development January 2007
Olve Maudal
Background: • BEng (Hons) Software Engineering (UMIST, Manchester) • MSc Intelligent Robotics (DAI, Edinburgh) • ~4 years with Schlumberger, developing systems for finding oil • ~4 years with BBS, developing systems for moving money • ~2 years with TANDBERG, developing systems for audiovisual communication
Olve Maudal Email: [email protected] Mobile: +47 90093309 Skype: olve.maudal MSN: [email protected]
(from TechZone 2007)
![Page 3: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/3.jpg)
Olve Maudal Test-Driven Development January 2007
(overview)
• Brief introduction to Test-Driven Development • QUnit - A simple framework for unit testing in C++ • The Bowling Game Kata in C++ • More TDD examples • Q&A
(~40 minutes + QA)
![Page 4: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/4.jpg)
Olve Maudal Test-Driven Development January 2007
(blank)
![Page 5: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/5.jpg)
Olve Maudal Test-Driven Development January 2007
(overview) Intro to TDD
• Brief introduction to Test-Driven Development • QUnit - A simple framework for unit testing in C++ • The Bowling Game Kata in C++ • More TDD examples • Q&A
![Page 6: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/6.jpg)
Olve Maudal Test-Driven Development January 2007
Test-Driven Development (defined)
![Page 7: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/7.jpg)
Olve Maudal Test-Driven Development January 2007
Test-Driven Development (TDD) is a computer programming technique that involves repeatedly first writing a test case and then implementing only the code necessary to pass the test.
(source: Wikipedia)
Test-Driven Development (defined)
![Page 8: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/8.jpg)
Olve Maudal Test-Driven Development January 2007
Test-Driven Development (TDD) is a computer programming technique that involves repeatedly first writing a test case and then implementing only the code necessary to pass the test. ... Practitioners emphasize that test-driven development is a method of designing software, not merely a method of testing.
(source: Wikipedia)
Test-Driven Development (defined)
![Page 9: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/9.jpg)
Olve Maudal Test-Driven Development January 2007
Test-Driven Development Cycle
![Page 10: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/10.jpg)
Olve Maudal Test-Driven Development January 2007
Test-Driven Development Cycle
Add a test
![Page 11: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/11.jpg)
Olve Maudal Test-Driven Development January 2007
Test-Driven Development Cycle
Add a test Run all tests
![Page 12: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/12.jpg)
Olve Maudal Test-Driven Development January 2007
Test-Driven Development Cycle
Add a test Run all tests Write some code [Fail]
![Page 13: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/13.jpg)
Olve Maudal Test-Driven Development January 2007
Test-Driven Development Cycle
Add a test Run all tests Write some code [Fail]
[Pass]
![Page 14: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/14.jpg)
Olve Maudal Test-Driven Development January 2007
Test-Driven Development Cycle
Add a test Run all tests Write some code [Fail]
[Pass]
need refactoring? [Yes]
![Page 15: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/15.jpg)
Olve Maudal Test-Driven Development January 2007
Test-Driven Development Cycle
Add a test Run all tests Write some code [Fail]
[Pass]
need refactoring? [Yes] [No]
![Page 16: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/16.jpg)
Olve Maudal Test-Driven Development January 2007
Why do you need TDD?
![Page 17: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/17.jpg)
Olve Maudal Test-Driven Development January 2007
Why do you need TDD?
“Make everything as simple as possible, but not simpler.” (Albert Einstein)
![Page 18: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/18.jpg)
Olve Maudal Test-Driven Development January 2007
Why do you need TDD?
“Make everything as simple as possible, but not simpler.” (Albert Einstein)
“Anything that does not directly contribute value to the customer is waste. Perhaps the single biggest source of waste in software development is unused functionality.”
(leansoftwareinstitute.com)
![Page 19: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/19.jpg)
Olve Maudal Test-Driven Development January 2007
Why do you need TDD?
“Make everything as simple as possible, but not simpler.” (Albert Einstein)
“Anything that does not directly contribute value to the customer is waste. Perhaps the single biggest source of waste in software development is unused functionality.”
(leansoftwareinstitute.com)
... to avoid design paralysis.
![Page 20: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/20.jpg)
Olve Maudal Test-Driven Development January 2007
What do you need for TDD?
![Page 21: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/21.jpg)
Olve Maudal Test-Driven Development January 2007
What do you need for TDD?
• a framework for unit testing
![Page 22: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/22.jpg)
Olve Maudal Test-Driven Development January 2007
What do you need for TDD?
• a framework for unit testing • a powerful development environment
![Page 23: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/23.jpg)
Olve Maudal Test-Driven Development January 2007
(blank)
![Page 24: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/24.jpg)
Olve Maudal Test-Driven Development January 2007
(overview) QUnit
• Brief introduction to Test-Driven Development • QUnit - A simple framework for unit testing in C++ • The Bowling Game Kata in C++ • More TDD examples • Q&A
![Page 25: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/25.jpg)
Olve Maudal Test-Driven Development January 2007
Unit Testing (defined)
![Page 26: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/26.jpg)
Olve Maudal Test-Driven Development January 2007
In computer programming, unit testing is a procedure used to validate that individual modules or units of source code are working properly.
(source: Wikipedia)
Unit Testing (defined)
![Page 27: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/27.jpg)
Olve Maudal Test-Driven Development January 2007
In computer programming, unit testing is a procedure used to validate that individual modules or units of source code are working properly. ... in Object Oriented Design smallest unit is always Class
(source: Wikipedia)
Unit Testing (defined)
![Page 28: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/28.jpg)
Olve Maudal Test-Driven Development January 2007
Unit Testing Frameworks
Boost Test Library
CPPUnit
CppUnitLite
C++test NanoCppUnit
cxxtest
TUT
QuickTest
Unit++
UnitTest++
GNU Autounit
Check
CUnit GUnit
MinUnit
Cgreen
CuTest
NUnit
csUnit
MbUnit
PyUnit Test::Unit
JUnit TestNG
![Page 29: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/29.jpg)
Olve Maudal Test-Driven Development January 2007
Unit Testing Frameworks
Boost Test Library
CPPUnit
CppUnitLite
C++test NanoCppUnit
cxxtest
TUT
QuickTest
Unit++
UnitTest++
GNU Autounit
Check
CUnit GUnit
MinUnit
Cgreen
CuTest
NUnit
csUnit
MbUnit
PyUnit Test::Unit
JUnit TestNG
BLAH!
![Page 30: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/30.jpg)
Olve Maudal Test-Driven Development January 2007
QUnit – A Framework for Unit Testing
If not already an integrated part of your development environment then you probably want something that: • feels like ~50 lines of code • fits nicely into your favourite development environment • have no bells and whistles
![Page 31: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/31.jpg)
Olve Maudal Test-Driven Development January 2007
QUnit – A Framework for Unit Testing
If not already an integrated part of your development environment then you probably want something that: • feels like ~50 lines of code • fits nicely into your favourite development environment • have no bells and whistles
... something that can be used as an idiom: just implement when you need it!
![Page 32: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/32.jpg)
Olve Maudal Test-Driven Development January 2007
QUnit – A Framework for Unit Testing
so here I give it to you...
... something that can be used as an idiom: just implement when you need it!
![Page 33: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/33.jpg)
Olve Maudal Test-Driven Development January 2007
QUnit (the source code) // QUnit.hpp - A Unit Testing Framework - Olve Maudal (2007) #ifndef QUNIT_HPP #define QUNIT_HPP #include <string> class QUnit { private: std::string _name; std::string _context; int _steps; int _tests; int _errors; int _verbose; protected: QUnit(std::string name) : _name(name), _context(""), _steps(0), _tests(0), _errors(0), _verbose(0) {} virtual ~QUnit() {} int verbose() { return _verbose; }; void setContext(std::string context); void assertTrue(int condition, const char * str = NULL, const char * file = NULL, int line = -1); virtual void run() = 0; public: int execute(int argc, char ** argv); }; #endif
// QUnit.cpp - A Unit Testing Framework - Olve Maudal (2007) #include "QUnit.hpp" #include <iostream> using namespace std; void QUnit::setContext(string context) { _context = context; _steps = 0; } void QUnit::assertTrue(int condition, const char * str, const char * file, int line) { _steps++; _tests++; _errors += (condition != true); if( _verbose ) { cout << (condition?"OK ":"ERROR ") << _name << "/" << _context << "/" << _steps << endl; } if( !condition && str && file) { cerr << file << ":" << line << ": unittest failed: " << str << " (" << _name << "/" << _context << "/" << _steps << ")" << endl; } } int QUnit::execute(int argc, char ** argv) { for ( int i=1; i<argc; ++i ) { if ( strcmp(argv[i], "-v") == 0 ) { _verbose++; continue; } cerr << "usage: " << argv[0] << " -v" << endl; return -1; } run(); if( verbose() > 0 ) { cout << _name << (_errors? " FAILED":" OK") << " (" << _tests << " tests, " << _errors << " errors)" << endl; } return _errors; }
![Page 34: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/34.jpg)
Olve Maudal Test-Driven Development January 2007
QUnitDemo
// QUnitDemo.cpp #include "QUnit.hpp" class QUnitDemo : public QUnit { public: QUnitDemo() : QUnit("QUnitDemo") {} void run() { } }; int main(int argc, char** argv) { QUnitDemo t; return t.execute(argc, argv); }
![Page 35: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/35.jpg)
Olve Maudal Test-Driven Development January 2007
QUnitDemo
> g++ -c QUnit.cpp > g++ -o QUnitDemo QUnitDemo.cpp QUnit.o > QUnitDemo -v QUnitDemo OK (0 tests, 0 errors)
![Page 36: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/36.jpg)
Olve Maudal Test-Driven Development January 2007
QUnitDemo
// QUnitDemo.cpp #include "QUnit.hpp" class QUnitDemo : public QUnit { public: QUnitDemo() : QUnit("QUnitDemo") {} void run() { assertTrue(1 == 1); } }; int main(int argc, char** argv) { QUnitDemo t; return t.execute(argc, argv); }
![Page 37: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/37.jpg)
Olve Maudal Test-Driven Development January 2007
QUnitDemo
g++ -o QUnitDemo QUnitDemo.cpp QUnit.o QUnitDemo -v OK QUnitDemo//1 QUnitDemo OK (1 tests, 0 errors)
![Page 38: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/38.jpg)
Olve Maudal Test-Driven Development January 2007
QUnitDemo
// QUnitDemo.cpp #include "QUnit.hpp" class QUnitDemo : public QUnit { public: QUnitDemo() : QUnit("QUnitDemo") {} void run() { assertTrue(1 == 1); assertTrue(2 == 2); assertTrue(3 == 3); assertTrue(4 == 7); assertTrue(5 == 5); } }; int main(int argc, char** argv) { QUnitDemo t; return t.execute(argc, argv); }
![Page 39: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/39.jpg)
Olve Maudal Test-Driven Development January 2007
QUnitDemo
OK QUnitDemo//1 OK QUnitDemo//2 OK QUnitDemo//3 ERROR QUnitDemo//4 OK QUnitDemo//5 QUnitDemo FAILED (5 tests, 1 errors)
![Page 40: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/40.jpg)
Olve Maudal Test-Driven Development January 2007
QUnitDemo // QUnitDemo.cpp #include "QUnit.hpp" #include <string> using namespace std; class QUnitDemo : public QUnit { public: QUnitDemo() : QUnit("QUnitDemo") {} void run() { assertTrue(1 == 1); assertTrue(2 == 2); assertTrue(3 == 3); assertTrue(4 == 7); assertTrue(5 == 5); string str1 = "a"; string str2 = "b"; string str3 = "ab"; assertTrue( str1 == str2 ); assertTrue( str1 + str2 == str3 ); } }; int main(int argc, char** argv) { QUnitDemo t; return t.execute(argc, argv); }
![Page 41: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/41.jpg)
Olve Maudal Test-Driven Development January 2007
QUnitDemo
OK QUnitDemo//1 OK QUnitDemo//2 OK QUnitDemo//3 ERROR QUnitDemo//4 OK QUnitDemo//5 ERROR QUnitDemo//6 OK QUnitDemo//7 QUnitDemo FAILED (7 tests, 2 errors)
![Page 42: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/42.jpg)
Olve Maudal Test-Driven Development January 2007
QUnitDemo // QUnitDemo.cpp #include "QUnit.hpp" #include <string> using namespace std; class QUnitDemo : public QUnit { public: QUnitDemo() : QUnit("QUnitDemo") {} void run() { setContext("testBasicStuff"); assertTrue(1 == 1); assertTrue(2 == 2); assertTrue(3 == 3); assertTrue(4 == 7); assertTrue(5 == 5); setContext("testStringStuff"); string str1 = "a"; string str2 = "b"; string str3 = "ab"; assertTrue( str1 == str2 ); assertTrue( str1 + str2 == str3 ); } }; int main(int argc, char** argv) { QUnitDemo t; return t.execute(argc, argv); }
![Page 43: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/43.jpg)
Olve Maudal Test-Driven Development January 2007
QUnitDemo
OK QUnitDemo/testBasicStuff/1 OK QUnitDemo/testBasicStuff/2 OK QUnitDemo/testBasicStuff/3 ERROR QUnitDemo/testBasicStuff/4 OK QUnitDemo/testBasicStuff/5 ERROR QUnitDemo/testStringStuff/1 OK QUnitDemo/testStringStuff/2 QUnitDemo FAILED (7 tests, 2 errors)
![Page 44: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/44.jpg)
Olve Maudal Test-Driven Development January 2007
QUnitDemo // QUnitDemo.cpp #include "QUnit.hpp" #include <string> using namespace std; class QUnitDemo : public QUnit { public: QUnitDemo() : QUnit("QUnitDemo") {} void run() { setContext("testBasicStuff"); assertTrue(1 == 1); assertTrue(2 == 2); assertTrue(3 == 3); assertTrue(4 == 7); assertTrue(5 == 5); setContext("testStringStuff"); string str1 = "a"; string str2 = "b"; string str3 = "ab"; assertTrue( str1 == str2, "comparing str1 and str2", __FILE__ , __LINE__ ); assertTrue( str1 + str2 == str3 ); } }; int main(int argc, char** argv) { QUnitDemo t; return t.execute(argc, argv); }
![Page 45: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/45.jpg)
Olve Maudal Test-Driven Development January 2007
QUnitDemo
OK QUnitDemo/testBasicStuff/1 OK QUnitDemo/testBasicStuff/2 OK QUnitDemo/testBasicStuff/3 ERROR QUnitDemo/testBasicStuff/4 OK QUnitDemo/testBasicStuff/5 ERROR QUnitDemo/testStringStuff/1 QUnitDemo.cpp:24: unittest failed: comparing str1 and str2 (QUnitDemo/testStringStuff/1) OK QUnitDemo/testStringStuff/2 QUnitDemo FAILED (7 tests, 1 errors)
![Page 46: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/46.jpg)
Olve Maudal Test-Driven Development January 2007
QUnitDemo // QUnitDemo.cpp #include "QUnit.hpp" #include <string> using namespace std; #define ASSERT_TRUE(cond) ( assertTrue(cond, #cond, __FILE__, __LINE__) ) class QUnitDemo : public QUnit { public: QUnitDemo() : QUnit("QUnitDemo") {} void run() { setContext("testBasicStuff"); ASSERT_TRUE(1 == 1); ASSERT_TRUE(2 == 2); ASSERT_TRUE(3 == 3); ASSERT_TRUE(4 == 7); ASSERT_TRUE(5 == 5); setContext("testStringStuff"); string str1 = "a"; string str2 = "b"; string str3 = "ab"; ASSERT_TRUE( str1 == str2 ); ASSERT_TRUE( str1 + str2 == str3 ); } }; int main(int argc, char** argv) { QUnitDemo t; return t.execute(argc, argv); }
![Page 47: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/47.jpg)
Olve Maudal Test-Driven Development January 2007
QUnitDemo
OK QUnitDemo/testBasicStuff/1 OK QUnitDemo/testBasicStuff/2 OK QUnitDemo/testBasicStuff/3 ERROR QUnitDemo/testBasicStuff/4 QUnitDemo.cpp:18: unittest failed: 4 == 7 (QUnitDemo/testBasicStuff/4) OK QUnitDemo/testBasicStuff/5 ERROR QUnitDemo/testStringStuff/1 QUnitDemo.cpp:26: unittest failed: str1 == str2 (QUnitDemo/testStringStuff/1) OK QUnitDemo/testStringStuff/2 QUnitDemo FAILED (7 tests, 2 errors)
![Page 48: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/48.jpg)
Olve Maudal Test-Driven Development January 2007
QUnitDemo // QUnitDemo.cpp #include "QUnit.hpp" #include <string> using namespace std; #define ASSERT_TRUE(cond) ( assertTrue(cond, #cond, __FILE__, __LINE__) ) class QUnitDemo : public QUnit { public: QUnitDemo() : QUnit("QUnitDemo") {} void run() { setContext("testBasicStuff"); testBasicStuff(); setContext("testStringStuff"); testStringStuff(); } void testBasicStuff() { ASSERT_TRUE(1 == 1); ASSERT_TRUE(2 == 2); ASSERT_TRUE(3 == 3); ASSERT_TRUE(4 == 7); ASSERT_TRUE(5 == 5); } void testStringStuff() { string str1 = "a"; string str2 = "b"; string str3 = "ab"; ASSERT_TRUE( str1 == str2 ); ASSERT_TRUE( str1 + str2 == str3 ); } }; int main(int argc, char** argv) { QUnitDemo t; return t.execute(argc, argv); }
![Page 49: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/49.jpg)
Olve Maudal Test-Driven Development January 2007
QUnitDemo // QUnitDemo.cpp #include "QUnit.hpp" #include <string> using namespace std; #define ASSERT_TRUE(cond) ( assertTrue(cond, #cond, __FILE__, __LINE__) ) #define RUNTEST(name) {setContext(#name); name();} class QUnitDemo : public QUnit { public: QUnitDemo() : QUnit("QUnitDemo") {} void run() { RUNTEST(testBasicStuff); RUNTEST(testStringStuff); } void testBasicStuff() { ASSERT_TRUE(1 == 1); ASSERT_TRUE(2 == 2); ASSERT_TRUE(3 == 3); ASSERT_TRUE(4 == 7); ASSERT_TRUE(5 == 5); } void testStringStuff() { string str1 = "a"; string str2 = "b"; string str3 = "ab"; ASSERT_TRUE( str1 == str2 ); ASSERT_TRUE( str1 + str2 == str3 ); } }; int main(int argc, char** argv) { QUnitDemo t; return t.execute(argc, argv); }
![Page 50: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/50.jpg)
Olve Maudal Test-Driven Development January 2007
QUnitDemo
g++ -o QUnitDemo QUnitDemo.cpp QUnit.cpp && QUnitDemo -v OK QUnitDemo/testBasicStuff/1 OK QUnitDemo/testBasicStuff/2 OK QUnitDemo/testBasicStuff/3 ERROR QUnitDemo/testBasicStuff/4 QUnitDemo.cpp:23: unittest failed: 4 == 7 (QUnitDemo/testBasicStuff/4) OK QUnitDemo/testBasicStuff/5 ERROR QUnitDemo/testStringStuff/1 QUnitDemo.cpp:32: unittest failed: str1 == str2 (QUnitDemo/testStringStuff/1) OK QUnitDemo/testStringStuff/2 QUnitDemo FAILED (7 tests, 2 errors)
![Page 51: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/51.jpg)
Olve Maudal Test-Driven Development January 2007
QUnitDemo
g++ -o QUnitDemo QUnitDemo.cpp QUnit.cpp && QUnitDemo QUnitDemo.cpp:23: unittest failed: 4 == 7 (QUnitDemo/testBasicStuff/4) QUnitDemo.cpp:32: unittest failed: str1 == str2 (QUnitDemo/testStringStuff/1)
![Page 52: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/52.jpg)
Olve Maudal Test-Driven Development January 2007
QUnitDemo // QUnitDemo.cpp #include "QUnit.hpp" #include <string> using namespace std; #define ASSERT_TRUE(cond) ( assertTrue(cond, #cond, __FILE__, __LINE__) ) #define RUNTEST(name) {setContext(#name); name();} class QUnitDemo : public QUnit { public: QUnitDemo() : QUnit("QUnitDemo") {} void run() { RUNTEST(testBasicStuff); RUNTEST(testStringStuff); } void testBasicStuff() { ASSERT_TRUE(1 == 1); ASSERT_TRUE(2 == 2); ASSERT_TRUE(3 == 3); ASSERT_TRUE(4 != 7); ASSERT_TRUE(5 == 5); } void testStringStuff() { string str1 = "a"; string str2 = "b"; string str3 = "ab"; ASSERT_TRUE( str1 != str2 ); ASSERT_TRUE( str1 + str2 == str3 ); } }; int main(int argc, char** argv) { QUnitDemo t; return t.execute(argc, argv); }
![Page 53: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/53.jpg)
Olve Maudal Test-Driven Development January 2007
QUnitDemo
g++ -o QUnitDemo QUnitDemo.cpp QUnit.cpp && QUnitDemo
![Page 54: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/54.jpg)
Olve Maudal Test-Driven Development January 2007
QUnitDemo
g++ -o QUnitDemo QUnitDemo.cpp QUnit.cpp && QUnitDemo && echo Success Success
![Page 55: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/55.jpg)
Olve Maudal Test-Driven Development January 2007
(blank)
![Page 56: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/56.jpg)
Olve Maudal Test-Driven Development January 2007
(overview) Bowling
• Brief introduction to Test-Driven Development • QUnit - A simple framework for unit testing in C++ • The Bowling Game Kata in C++ • More TDD examples • Q&A
![Page 57: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/57.jpg)
Olve Maudal Test-Driven Development January 2007
(picture)
![Page 58: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/58.jpg)
Olve Maudal Test-Driven Development January 2007
Bowling Game Kata in C++ The following is a demonstration of how to do test-driven development using the our new framework for unit testing in C++. We are going to write some code for scoring a game of bowling. Since the seminal article "Engineer Notebook: An Extreme Programming Episode" published in 2001 by Robert C. Martin and Robert S. Koss: • http://www.objectmentor.com/resources/articles/xpepisode.htm calculating the score for a bowling game has gained status as an advanced "Hello World" for programming languages. For any programming language out there you will find a bowling score implementation insipred by the "XP Episode". There is also a lot of derivative work from this article, some of them demonstrating how design evolves through Test-Driven Development. What you will see now is taken more or less directly out of the excellent “Bowling Game Kata” presentation by Robert C. Martin. • http://butunclebob.com • http://butunclebob.com/ArticleS.UncleBob.TheBowlingGameKata • http://butunclebob.com/files/downloads/Bowling%20Game%20Kata.ppt
Basically the only thing I have done is to translate from Java/JUnit into C++/QUnit.
![Page 59: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/59.jpg)
Olve Maudal Test-Driven Development January 2007
Since Uncle Bob is a nice guy...
The following slides are not verbatim copies, but they are close enough to deserve a proper copyright notice... Some of the material is probably Copyright (C) 2005 by Object Mentor. Permission to use was given by Uncle Bob.
... we include this page, because he asked us to do so:
![Page 60: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/60.jpg)
Olve Maudal Test-Driven Development January 2007
The game consists of 10 frames as shown above. In each frame the player has two opportunities to knock down 10 pins. The score for the frame is the total number of pins knocked down, plus bonuses for strikes and spares. A spare is when the player knocks down all 10 pins in two tries. The bonus for that frame is the number of pins knocked down by the next roll. So in frame 3 above, the score is 10 (the total number knocked down) plus a bonus of 5 (the number of pins knocked down on the next roll.) A strike is when the player knocks down all 10 pins on his first try. The bonus for that frame is the value of the next two balls rolled. In the tenth frame a player who rolls a spare or strike is allowed to roll the extra balls to complete the frame. However no more than three balls can be rolled in tenth frame.
Scoring Bowling
[source: Uncle Bob]
![Page 61: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/61.jpg)
Olve Maudal Test-Driven Development January 2007
The Requirements.
+ roll(pins : int)+ score() : int
Game
Write a class named “Game” that has two methods:
• roll(pins : int) is called each time the player rolls a ball. The argument is the number of pins knocked down. • score() : int is called only at the very end of the game. It returns the total score for that game.
[source: Uncle Bob]
![Page 62: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/62.jpg)
Olve Maudal Test-Driven Development January 2007
Scoring Bowling & The Requirements
The game consists of 10 frames as shown above. In each frame the player has two opportunities to knock down 10 pins. The score for the frame is the total number of pins knocked down, plus bonuses for strikes and spares. A spare is when the player knocks down all 10 pins in two tries. The bonus for that frame is the number of pins knocked down by the next roll. So in frame 3 above, the score is 10 (the total number knocked down) plus a bonus of 5 (the number of pins knocked down on the next roll.) A strike is when the player knocks down all 10 pins on his first try. The bonus for that frame is the value of the next two balls rolled. In the tenth frame a player who rolls a spare or strike is allowed to roll the extra balls to complete the frame. However no more than three balls can be rolled in tenth frame.
+ roll(pins : int)+ score() : int
Game
Write a class named “Game” that has two methods: • roll(pins : int) is called each time the player rolls a ball. The argument is the number of pins knocked down. • score() : int is called only at the very end of the game. It returns the total score for that game.
[source: Uncle Bob]
![Page 63: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/63.jpg)
Olve Maudal Test-Driven Development January 2007
A quick design session
+ roll(pins : int)+ score() : int
Game
Clearly we need the Game class.
[source: Uncle Bob]
![Page 64: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/64.jpg)
Olve Maudal Test-Driven Development January 2007
A quick design session
+ roll(pins : int)+ score() : int
Game Frame10
A game has 10 frames.
[source: Uncle Bob]
![Page 65: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/65.jpg)
Olve Maudal Test-Driven Development January 2007
A quick design session
+ roll(pins : int)+ score() : int
Game Frame
- pins : int
Roll10 1..2
A frame has 1 or two rolls.
[source: Uncle Bob]
![Page 66: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/66.jpg)
Olve Maudal Test-Driven Development January 2007
A quick design session
+ roll(pins : int)+ score() : int
Game Frame
Tenth Frame
- pins : int
Roll10 1..2
1
The tenth frame has two or three rolls. It is different from all the other frames.
[source: Uncle Bob]
![Page 67: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/67.jpg)
Olve Maudal Test-Driven Development January 2007
A quick design session
+ roll(pins : int)+ score() : int
Game
+ score() : int
Frame
Tenth Frame
- pins : int
Roll10 1..2
1The score function must iterate through all the frames, and calculate all their scores.
[source: Uncle Bob]
![Page 68: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/68.jpg)
Olve Maudal Test-Driven Development January 2007
A quick design session
+ roll(pins : int)+ score() : int
Game
+ score() : int
Frame
Tenth Frame
- pins : int
Roll10 1..2
1
next frame The score for a spare or a strike depends on the frame’s successor
[source: Uncle Bob]
![Page 69: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/69.jpg)
Olve Maudal Test-Driven Development January 2007
A quick design session
+ roll(pins : int)+ score() : int
Game
+ score() : int
Frame
Tenth Frame
- pins : int
Roll10 1..2
1
next frame
class Game { Frame _frames[10]; public: void roll(int pins); int score(); };
class Frame { Roll _rolls[2]; public: virtual int score(); };
class TenthFrame : public Frame { Roll _extraroll; public: int score(); };
struct Roll { int pins; };
![Page 70: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/70.jpg)
Olve Maudal Test-Driven Development January 2007
A quick design session
+ roll(pins : int)+ score() : int
Game
+ score() : int
Frame
Tenth Frame
- pins : int
Roll10 1..2
1
next frame
class Game { Frame _frames[10]; public: void roll(int pins); int score(); };
class Frame { Roll _rolls[2]; public: virtual int score(); };
class TenthFrame : public Frame { Roll _extraroll; public: int score(); };
struct Roll { int pins; };
![Page 71: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/71.jpg)
Olve Maudal Test-Driven Development January 2007
A quick design session
+ roll(pins : int)+ score() : int
Game
+ score() : int
Frame
Tenth Frame
- pins : int
Roll10 1..2
1
next frame
class Game { Frame _frames[10]; public: void roll(int pins); int score(); };
class Frame { Roll _rolls[2]; public: int score(); };
class TenthFrame : public Frame { Roll _extraroll; public: int score(); };
struct Roll { int pins; };
![Page 72: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/72.jpg)
Olve Maudal Test-Driven Development January 2007
(blank)
![Page 73: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/73.jpg)
Olve Maudal Test-Driven Development January 2007
Traditional OOAD vs Test-Driven Development
![Page 74: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/74.jpg)
Olve Maudal Test-Driven Development January 2007
Traditional OOAD vs Test-Driven Development
Traditional upfront OOAD often comes up with far too complex solutions, and it is quite common to end up in a state of “design paralysis”.
![Page 75: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/75.jpg)
Olve Maudal Test-Driven Development January 2007
Traditional OOAD vs Test-Driven Development
Traditional upfront OOAD often comes up with far too complex solutions, and it is quite common to end up in a state of “design paralysis”. Test-Driven Development is a design technique, perhaps more so than a programming technique. You will often see that TDD leads to a very different design in the end compared to what you often get with traditional OOAD.
![Page 76: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/76.jpg)
Olve Maudal Test-Driven Development January 2007
(blank)
![Page 77: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/77.jpg)
Olve Maudal Test-Driven Development January 2007
Begin with Test-Driven Development
• Create a new project named BowlingGame • Create an empty BowlingGame class • Create a unit test named BowlingGameTest • Set up a unit test environment
mkdir BowlingGame cd BowlingGame cp ../QUnit.cpp ../QUnit.hpp . ed BowlingGame.hpp ed BowlingGameTest ed Makefile make
![Page 78: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/78.jpg)
Olve Maudal Test-Driven Development January 2007
The empty class (BowlingGame.hpp)
// BowlingGame.hpp - a bowling score calculator class BowlingGame { };
![Page 79: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/79.jpg)
Olve Maudal Test-Driven Development January 2007
The empty test (BowlingGameTest.cpp)
// BowlingGameTest.cpp - Bowling Game Kata in C++ / QUnit #include "QUnit.hpp" #include "BowlingGame.hpp" #include <iostream> #define ASSERT_TRUE(cond) ( assertTrue(cond, #cond, __FILE__, __LINE__) ) #define RUNTEST(name) {setContext(#name); name();} class BowlingGameTest : public QUnit { public: BowlingGameTest() : QUnit("BowlingGameTest") {}; void run() { BowlingGame g; } }; int main(int argc, char ** argv) { BowlingGameTest t; return t.execute(argc, argv); }
![Page 80: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/80.jpg)
Olve Maudal Test-Driven Development January 2007
Set up a unit test environment (Makefile)
# Makefile BowlingGameTest : BowlingGameTest.cpp BowlingGame.hpp QUnit.o
g++ -o BowlingGameTest BowlingGameTest.cpp QUnit.o BowlingGameTest -v
QUnit.o : QUnit.cpp QUnit.hpp
g++ -c QUnit.cpp clean:
rm BowlingGameTest QUnit.o
![Page 81: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/81.jpg)
Olve Maudal Test-Driven Development January 2007
Verify the set up
g++ -c QUnit.cpp g++ -o BowlingGameTest BowlingGameTest.cpp QUnit.o BowlingGameTest -v BowlingGameTest OK (0 tests, 0 errors)
![Page 82: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/82.jpg)
Olve Maudal Test-Driven Development January 2007
The first test.
![Page 83: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/83.jpg)
Olve Maudal Test-Driven Development January 2007
The first test.
class BowlingGame { };
class BowlingGameTest : public QUnit { public: BowlingGameTest(): QUnit("BowlingGameTest") {}; void run() { BowlingGame g; } };
![Page 84: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/84.jpg)
Olve Maudal Test-Driven Development January 2007
The first test.
class BowlingGame { };
class BowlingGameTest : public QUnit { public: BowlingGameTest(): QUnit("BowlingGameTest") {}; void run() { RUNTEST(testGutterGame); } void testGutterGame() { BowlingGame g; } };
![Page 85: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/85.jpg)
Olve Maudal Test-Driven Development January 2007
The first test.
class BowlingGame { };
class BowlingGameTest : public QUnit { public: BowlingGameTest(): QUnit("BowlingGameTest") {}; void run() { RUNTEST(testGutterGame); } void testGutterGame() { BowlingGame g; } };
BowlingGameTest OK (0 tests, 0 errors)
![Page 86: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/86.jpg)
Olve Maudal Test-Driven Development January 2007
The first test.
class BowlingGame { };
class BowlingGameTest : public QUnit { public: BowlingGameTest(): QUnit("BowlingGameTest") {}; void run() { RUNTEST(testGutterGame); } void testGutterGame() { BowlingGame g; for (int i=0; i<20; ++i) { g.roll(0); } } };
![Page 87: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/87.jpg)
Olve Maudal Test-Driven Development January 2007
The first test.
class BowlingGame { public: void roll(int pins) {} };
class BowlingGameTest : public QUnit { public: BowlingGameTest(): QUnit("BowlingGameTest") {}; void run() { RUNTEST(testGutterGame); } void testGutterGame() { BowlingGame g; for (int i=0; i<20; ++i) { g.roll(0); } } };
![Page 88: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/88.jpg)
Olve Maudal Test-Driven Development January 2007
The first test.
class BowlingGame { public: void roll(int pins) {} };
class BowlingGameTest : public QUnit { public: BowlingGameTest(): QUnit("BowlingGameTest") {}; void run() { RUNTEST(testGutterGame); } void testGutterGame() { BowlingGame g; for (int i=0; i<20; ++i) { g.roll(0); } } };
BowlingGameTest OK (0 tests, 0 errors)
![Page 89: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/89.jpg)
Olve Maudal Test-Driven Development January 2007
The first test.
class BowlingGame { public: void roll(int pins) {} };
class BowlingGameTest : public QUnit { public: BowlingGameTest(): QUnit("BowlingGameTest") {}; void run() { RUNTEST(testGutterGame); } void testGutterGame() { BowlingGame g; for (int i=0; i<20; ++i) { g.roll(0); } ASSERT_TRUE(g.score() == 0); } };
![Page 90: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/90.jpg)
Olve Maudal Test-Driven Development January 2007
The first test.
class BowlingGame { int _score; public: void roll(int pins) {} int score() { return _score; } };
class BowlingGameTest : public QUnit { public: BowlingGameTest(): QUnit("BowlingGameTest") {}; void run() { RUNTEST(testGutterGame); } void testGutterGame() { BowlingGame g; for (int i=0; i<20; ++i) { g.roll(0); } ASSERT_TRUE(g.score() == 0); } };
![Page 91: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/91.jpg)
Olve Maudal Test-Driven Development January 2007
The first test.
class BowlingGame { int _score; public: void roll(int pins) {} int score() { return _score; } };
ERROR BowlingGameTest/testGutterGame/1 BowlingGameTest.cpp:23: unittest failed: g.score() == 0 (BowlingGameTest/testGutterGame/1) BowlingGameTest FAILED (1 tests, 1 errors)
class BowlingGameTest : public QUnit { public: BowlingGameTest(): QUnit("BowlingGameTest") {}; void run() { RUNTEST(testGutterGame); } void testGutterGame() { BowlingGame g; for (int i=0; i<20; ++i) { g.roll(0); } ASSERT_TRUE(g.score() == 0); } };
![Page 92: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/92.jpg)
Olve Maudal Test-Driven Development January 2007
The first test.
class BowlingGame { int _score; public: BowlingGame() : _score(0) {} void roll(int pins) {} int score() { return _score; } };
class BowlingGameTest : public QUnit { public: BowlingGameTest(): QUnit("BowlingGameTest") {}; void run() { RUNTEST(testGutterGame); } void testGutterGame() { BowlingGame g; for (int i=0; i<20; ++i) { g.roll(0); } ASSERT_TRUE(g.score() == 0); } };
![Page 93: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/93.jpg)
Olve Maudal Test-Driven Development January 2007
The first test.
class BowlingGame { int _score; public: BowlingGame() : _score(0) {} void roll(int pins) {} int score() { return _score; } };
class BowlingGameTest : public QUnit { public: BowlingGameTest(): QUnit("BowlingGameTest") {}; void run() { RUNTEST(testGutterGame); } void testGutterGame() { BowlingGame g; for (int i=0; i<20; ++i) { g.roll(0); } ASSERT_TRUE(g.score() == 0); } };
BowlingGameTest -v OK BowlingGameTest/testGutterGame/1 BowlingGameTest OK (1 tests, 0 errors)
![Page 94: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/94.jpg)
Olve Maudal Test-Driven Development January 2007
The first test.
class BowlingGame { int _score; public: BowlingGame() : _score(0) {} void roll(int pins) {} int score() { return _score; } };
class BowlingGameTest : public QUnit { public: BowlingGameTest(): QUnit("BowlingGameTest") {}; void run() { RUNTEST(testGutterGame); } void testGutterGame() { BowlingGame g; for (int i=0; i<20; ++i) { g.roll(0); } ASSERT_TRUE(g.score() == 0); } };
![Page 95: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/95.jpg)
Olve Maudal Test-Driven Development January 2007
The Second Test
![Page 96: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/96.jpg)
Olve Maudal Test-Driven Development January 2007
The Second Test
class BowlingGameTest : public QUnit { public: BowlingGameTest() : QUnit("BowlingGameTest") {}; void run() { RUNTEST(testGutterGame); RUNTEST(testAllOnes); } void testGutterGame() { BowlingGame g; for (int i=0; i<20; ++i) { g.roll(0); } ASSERT_TRUE(g.score() == 0); } void testAllOnes() { BowlingGame g; for (int i=0; i<20; ++i) { g.roll(1); } ASSERT_TRUE(g.score() == 20); } };
class BowlingGame { int _score; public: BowlingGame() : _score(0) {} void roll(int pins) {} int score() { return _score; } };
![Page 97: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/97.jpg)
Olve Maudal Test-Driven Development January 2007
The Second Test
class BowlingGameTest : public QUnit { public: BowlingGameTest() : QUnit("BowlingGameTest") {}; void run() { RUNTEST(testGutterGame); RUNTEST(testAllOnes); } void testGutterGame() { BowlingGame g; for (int i=0; i<20; ++i) { g.roll(0); } ASSERT_TRUE(g.score() == 0); } void testAllOnes() { BowlingGame g; for (int i=0; i<20; ++i) { g.roll(1); } ASSERT_TRUE(g.score() == 20); } };
class BowlingGame { int _score; public: BowlingGame() : _score(0) {} void roll(int pins) {} int score() { return _score; } };
OK BowlingGameTest/testGutterGame/1 ERROR BowlingGameTest/testAllOnes/1 BowlingGameTest.cpp:32: unittest failed: g.score() == 20 (BowlingGameTest/testAllOnes/1) BowlingGameTest FAILED (2 tests, 1 errors)
![Page 98: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/98.jpg)
Olve Maudal Test-Driven Development January 2007
The Second Test
class BowlingGameTest : public QUnit { public: BowlingGameTest() : QUnit("BowlingGameTest") {}; void run() { RUNTEST(testGutterGame); RUNTEST(testAllOnes); } void testGutterGame() { BowlingGame g; for (int i=0; i<20; ++i) { g.roll(0); } ASSERT_TRUE(g.score() == 0); } void testAllOnes() { BowlingGame g; for (int i=0; i<20; ++i) { g.roll(1); } ASSERT_TRUE(g.score() == 20); } };
class BowlingGame { int _score; public: BowlingGame() : _score(0) {} void roll(int pins) { _score += pins; } int score() { return _score; } };
![Page 99: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/99.jpg)
Olve Maudal Test-Driven Development January 2007
The Second Test
class BowlingGameTest : public QUnit { public: BowlingGameTest() : QUnit("BowlingGameTest") {}; void run() { RUNTEST(testGutterGame); RUNTEST(testAllOnes); } void testGutterGame() { BowlingGame g; for (int i=0; i<20; ++i) { g.roll(0); } ASSERT_TRUE(g.score() == 0); } void testAllOnes() { BowlingGame g; for (int i=0; i<20; ++i) { g.roll(1); } ASSERT_TRUE(g.score() == 20); } };
class BowlingGame { int _score; public: BowlingGame() : _score(0) {} void roll(int pins) { _score += pins; } int score() { return _score; } };
BowlingGameTest -v OK BowlingGameTest/testGutterGame/1 OK BowlingGameTest/testAllOnes/1 BowlingGameTest OK (2 tests, 0 errors)
![Page 100: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/100.jpg)
Olve Maudal Test-Driven Development January 2007
The Second Test
class BowlingGameTest : public QUnit { public: BowlingGameTest() : QUnit("BowlingGameTest") {}; void run() { RUNTEST(testGutterGame); RUNTEST(testAllOnes); } void testGutterGame() { BowlingGame g; for (int i=0; i<20; ++i) { g.roll(0); } ASSERT_TRUE(g.score() == 0); } void testAllOnes() { BowlingGame g; for (int i=0; i<20; ++i) { g.roll(1); } ASSERT_TRUE(g.score() == 20); } };
class BowlingGame { int _score; public: BowlingGame() : _score(0) {} void roll(int pins) { _score += pins; } int score() { return _score; } };
![Page 101: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/101.jpg)
Olve Maudal Test-Driven Development January 2007
The Second Test
class BowlingGameTest : public QUnit { public: BowlingGameTest() : QUnit("BowlingGameTest") {}; void run() { RUNTEST(testGutterGame); RUNTEST(testAllOnes); } void testGutterGame() { BowlingGame g; for (int i=0; i<20; ++i) { g.roll(0); } ASSERT_TRUE(g.score() == 0); } void testAllOnes() { BowlingGame g; for (int i=0; i<20; ++i) { g.roll(1); } ASSERT_TRUE(g.score() == 20); } };
class BowlingGame { int _score; public: BowlingGame() : _score(0) {} void roll(int pins) { _score += pins; } int score() { return _score; } };
Perhaps we need refactoring
of test code?
![Page 102: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/102.jpg)
Olve Maudal Test-Driven Development January 2007
The Second Test
class BowlingGameTest : public QUnit { public: BowlingGameTest() : QUnit("BowlingGameTest") {}; void run() { RUNTEST(testGutterGame); RUNTEST(testAllOnes); } void rollMany(BowlingGame& g, int n, int pins) { for (int i=0; i<n; ++i) { g.roll(pins); } } void testGutterGame() { BowlingGame g; rollMany(g,20,0); ASSERT_TRUE(g.score() == 0); } void testAllOnes() { BowlingGame g; rollMany(g,20,1); ASSERT_TRUE(g.score() == 20); } };
class BowlingGame { int _score; public: BowlingGame() : _score(0) {} void roll(int pins) { _score += pins; } int score() { return _score; } };
![Page 103: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/103.jpg)
Olve Maudal Test-Driven Development January 2007
The Second Test
class BowlingGameTest : public QUnit { public: BowlingGameTest() : QUnit("BowlingGameTest") {}; void run() { RUNTEST(testGutterGame); RUNTEST(testAllOnes); } void rollMany(BowlingGame& g, int n, int pins) { for (int i=0; i<n; ++i) { g.roll(pins); } } void testGutterGame() { BowlingGame g; rollMany(g,20,0); ASSERT_TRUE(g.score() == 0); } void testAllOnes() { BowlingGame g; rollMany(g,20,1); ASSERT_TRUE(g.score() == 20); } };
class BowlingGame { int _score; public: BowlingGame() : _score(0) {} void roll(int pins) { _score += pins; } int score() { return _score; } };
![Page 104: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/104.jpg)
Olve Maudal Test-Driven Development January 2007
The Second Test
class BowlingGameTest : public QUnit { public: BowlingGameTest() : QUnit("BowlingGameTest") {}; void run() { RUNTEST(testGutterGame); RUNTEST(testAllOnes); } void rollMany(BowlingGame& g, int n, int pins) { for (int i=0; i<n; ++i) { g.roll(pins); } } void testGutterGame() { BowlingGame g; rollMany(g,20,0); ASSERT_TRUE(g.score() == 0); } void testAllOnes() { BowlingGame g; rollMany(g,20,1); ASSERT_TRUE(g.score() == 20); } };
class BowlingGame { int _score; public: BowlingGame() : _score(0) {} void roll(int pins) { _score += pins; } int score() { return _score; } };
And beautify the code
![Page 105: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/105.jpg)
Olve Maudal Test-Driven Development January 2007
The Second Test
class BowlingGameTest : public QUnit { public: BowlingGameTest() : QUnit("BowlingGameTest") {}; void run() { RUNTEST(testGutterGame); RUNTEST(testAllOnes); } void rollMany(BowlingGame& g, int n, int pins) { for (int i=0; i<n; ++i) { g.roll(pins); } } void testGutterGame() { BowlingGame g; rollMany(g,20,0); ASSERT_TRUE(g.score() == 0); } void testAllOnes() { BowlingGame g; rollMany(g,20,1); ASSERT_TRUE(g.score() == 20); } };
class BowlingGame { int _score; public: BowlingGame() : _score(0) {} void roll(int pins) { _score += pins; } int score() { return _score; } };
![Page 106: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/106.jpg)
Olve Maudal Test-Driven Development January 2007
The Third Test
![Page 107: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/107.jpg)
Olve Maudal Test-Driven Development January 2007
The Third Test class BowlingGameTest : public QUnit { public: BowlingGameTest() : QUnit("BowlingGameTest") {}; void run() { RUNTEST(testGutterGame); RUNTEST(testAllOnes); RUNTEST(testOneSpare); } void rollMany(BowlingGame& g, int n, int pins) { for (int i=0; i<n; ++i) { g.roll(pins); } } void testGutterGame() { BowlingGame g; rollMany(g,20,0); ASSERT_TRUE(g.score() == 0); } void testAllOnes() { BowlingGame g; rollMany(g,20,1); ASSERT_TRUE(g.score() == 20); } void testOneSpare() { BowlingGame g; g.roll(5); g.roll(5); // spare g.roll(3); rollMany(g, 17, 0); ASSERT_TRUE(g.score() == 16); } };
class BowlingGame { int _score; public: BowlingGame() : _score(0) {} void roll(int pins) { _score += pins; } int score() { return _score; } };
![Page 108: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/108.jpg)
Olve Maudal Test-Driven Development January 2007
The Third Test class BowlingGameTest : public QUnit { public: BowlingGameTest() : QUnit("BowlingGameTest") {}; void run() { RUNTEST(testGutterGame); RUNTEST(testAllOnes); RUNTEST(testOneSpare); } void rollMany(BowlingGame& g, int n, int pins) { for (int i=0; i<n; ++i) { g.roll(pins); } } void testGutterGame() { BowlingGame g; rollMany(g,20,0); ASSERT_TRUE(g.score() == 0); } void testAllOnes() { BowlingGame g; rollMany(g,20,1); ASSERT_TRUE(g.score() == 20); } void testOneSpare() { BowlingGame g; g.roll(5); g.roll(5); // spare g.roll(3); rollMany(g, 17, 0); ASSERT_TRUE(g.score() == 16); } };
class BowlingGame { int _score; public: BowlingGame() : _score(0) {} void roll(int pins) { _score += pins; } int score() { return _score; } };
BowlingGameTest.cpp:44: unittest failed: g.score() == 16 (BowlingGameTest/testOneSpare/1) BowlingGameTest FAILED (3 tests, 1 errors)
![Page 109: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/109.jpg)
Olve Maudal Test-Driven Development January 2007
The Third Test class BowlingGameTest : public QUnit { public: BowlingGameTest() : QUnit("BowlingGameTest") {}; void run() { RUNTEST(testGutterGame); RUNTEST(testAllOnes); RUNTEST(testOneSpare); } void rollMany(BowlingGame& g, int n, int pins) { for (int i=0; i<n; ++i) { g.roll(pins); } } void testGutterGame() { BowlingGame g; rollMany(g,20,0); ASSERT_TRUE(g.score() == 0); } void testAllOnes() { BowlingGame g; rollMany(g,20,1); ASSERT_TRUE(g.score() == 20); } void testOneSpare() { BowlingGame g; g.roll(5); g.roll(5); // spare g.roll(3); rollMany(g, 17, 0); ASSERT_TRUE(g.score() == 16); } };
class BowlingGame { int _score; public: BowlingGame() : _score(0) {} void roll(int pins) { _score += pins; } int score() { return _score; } }; tempted to use flag to
remember previous roll. So design must be wrong.
![Page 110: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/110.jpg)
Olve Maudal Test-Driven Development January 2007
The Third Test class BowlingGameTest : public QUnit { public: BowlingGameTest() : QUnit("BowlingGameTest") {}; void run() { RUNTEST(testGutterGame); RUNTEST(testAllOnes); RUNTEST(testOneSpare); } void rollMany(BowlingGame& g, int n, int pins) { for (int i=0; i<n; ++i) { g.roll(pins); } } void testGutterGame() { BowlingGame g; rollMany(g,20,0); ASSERT_TRUE(g.score() == 0); } void testAllOnes() { BowlingGame g; rollMany(g,20,1); ASSERT_TRUE(g.score() == 20); } void testOneSpare() { BowlingGame g; g.roll(5); g.roll(5); // spare g.roll(3); rollMany(g, 17, 0); ASSERT_TRUE(g.score() == 16); } };
class BowlingGame { int _score; public: BowlingGame() : _score(0) {} void roll(int pins) { _score += pins; } int score() { return _score; } };
roll() calculates score, but name does not imply that..
score() does not calculate score, but name implies that it does.
![Page 111: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/111.jpg)
Olve Maudal Test-Driven Development January 2007
The Third Test class BowlingGameTest : public QUnit { public: BowlingGameTest() : QUnit("BowlingGameTest") {}; void run() { RUNTEST(testGutterGame); RUNTEST(testAllOnes); RUNTEST(testOneSpare); } void rollMany(BowlingGame& g, int n, int pins) { for (int i=0; i<n; ++i) { g.roll(pins); } } void testGutterGame() { BowlingGame g; rollMany(g,20,0); ASSERT_TRUE(g.score() == 0); } void testAllOnes() { BowlingGame g; rollMany(g,20,1); ASSERT_TRUE(g.score() == 20); } void testOneSpare() { BowlingGame g; g.roll(5); g.roll(5); // spare g.roll(3); rollMany(g, 17, 0); ASSERT_TRUE(g.score() == 16); } };
class BowlingGame { int _score; public: BowlingGame() : _score(0) {} void roll(int pins) { _score += pins; } int score() { return _score; } };
roll() calculates score, but name does not imply that..
score() does not calculate score, but name implies that it does.
Design is wrong. Responsibilities are misplaced.
![Page 112: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/112.jpg)
Olve Maudal Test-Driven Development January 2007
The Third Test class BowlingGameTest : public QUnit { public: BowlingGameTest() : QUnit("BowlingGameTest") {}; void run() { RUNTEST(testGutterGame); RUNTEST(testAllOnes); // RUNTEST(testOneSpare); } void rollMany(BowlingGame& g, int n, int pins) { for (int i=0; i<n; ++i) { g.roll(pins); } } void testGutterGame() { BowlingGame g; rollMany(g,20,0); ASSERT_TRUE(g.score() == 0); } void testAllOnes() { BowlingGame g; rollMany(g,20,1); ASSERT_TRUE(g.score() == 20); } // void testOneSpare() { // BowlingGame g; // g.roll(5); // g.roll(5); // spare // g.roll(3); // rollMany(g, 17, 0); // ASSERT_TRUE(g.score() == 16); // } };
class BowlingGame { int _score; public: BowlingGame() : _score(0) {} void roll(int pins) { _score += pins; } int score() { return _score; } };
![Page 113: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/113.jpg)
Olve Maudal Test-Driven Development January 2007
The Third Test class BowlingGame { int _score; public: BowlingGame() : _score(0) {} void roll(int pins) { _score += pins; } int score() { return _score; } };
class BowlingGameTest : public QUnit { public: BowlingGameTest() : QUnit("BowlingGameTest") {}; void run() { RUNTEST(testGutterGame); RUNTEST(testAllOnes); // RUNTEST(testOneSpare); } void rollMany(BowlingGame& g, int n, int pins) { for (int i=0; i<n; ++i) { g.roll(pins); } } void testGutterGame() { BowlingGame g; rollMany(g,20,0); ASSERT_TRUE(g.score() == 0); } void testAllOnes() { BowlingGame g; rollMany(g,20,1); ASSERT_TRUE(g.score() == 20); } // void testOneSpare() { // BowlingGame g; // g.roll(5); // g.roll(5); // spare // g.roll(3); // rollMany(g, 17, 0); // ASSERT_TRUE(g.score() == 16); // } };
![Page 114: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/114.jpg)
Olve Maudal Test-Driven Development January 2007
The Third Test class BowlingGameTest : public QUnit { public: BowlingGameTest() : QUnit("BowlingGameTest") {}; void run() { RUNTEST(testGutterGame); RUNTEST(testAllOnes); // RUNTEST(testOneSpare); } void rollMany(BowlingGame& g, int n, int pins) { for (int i=0; i<n; ++i) { g.roll(pins); } } void testGutterGame() { BowlingGame g; rollMany(g,20,0); ASSERT_TRUE(g.score() == 0); } void testAllOnes() { BowlingGame g; rollMany(g,20,1); ASSERT_TRUE(g.score() == 20); } // void testOneSpare() { // BowlingGame g; // g.roll(5); // g.roll(5); // spare // g.roll(3); // rollMany(g, 17, 0); // ASSERT_TRUE(g.score() == 16); // } };
class BowlingGame { int _score; int _rolls[21]; int _currentRoll; public: BowlingGame() : _score(0) , _currentRoll(0) {} void roll(int pins) { _score += pins; _rolls[_currentRoll++] = pins; } int score() { return _score; } };
![Page 115: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/115.jpg)
Olve Maudal Test-Driven Development January 2007
The Third Test class BowlingGameTest : public QUnit { public: BowlingGameTest() : QUnit("BowlingGameTest") {}; void run() { RUNTEST(testGutterGame); RUNTEST(testAllOnes); // RUNTEST(testOneSpare); } void rollMany(BowlingGame& g, int n, int pins) { for (int i=0; i<n; ++i) { g.roll(pins); } } void testGutterGame() { BowlingGame g; rollMany(g,20,0); ASSERT_TRUE(g.score() == 0); } void testAllOnes() { BowlingGame g; rollMany(g,20,1); ASSERT_TRUE(g.score() == 20); } // void testOneSpare() { // BowlingGame g; // g.roll(5); // g.roll(5); // spare // g.roll(3); // rollMany(g, 17, 0); // ASSERT_TRUE(g.score() == 16); // } };
class BowlingGame { int _score; int _rolls[21]; int _currentRoll; public: BowlingGame() : _score(0) , _currentRoll(0) {} void roll(int pins) { _score += pins; _rolls[_currentRoll++] = pins; } int score() { int score = 0; for (int i=0; i<21; ++i) { score += _rolls[i]; } return score; } };
![Page 116: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/116.jpg)
Olve Maudal Test-Driven Development January 2007
The Third Test class BowlingGameTest : public QUnit { public: BowlingGameTest() : QUnit("BowlingGameTest") {}; void run() { RUNTEST(testGutterGame); RUNTEST(testAllOnes); // RUNTEST(testOneSpare); } void rollMany(BowlingGame& g, int n, int pins) { for (int i=0; i<n; ++i) { g.roll(pins); } } void testGutterGame() { BowlingGame g; rollMany(g,20,0); ASSERT_TRUE(g.score() == 0); } void testAllOnes() { BowlingGame g; rollMany(g,20,1); ASSERT_TRUE(g.score() == 20); } // void testOneSpare() { // BowlingGame g; // g.roll(5); // g.roll(5); // spare // g.roll(3); // rollMany(g, 17, 0); // ASSERT_TRUE(g.score() == 16); // } };
class BowlingGame { int _score; int _rolls[21]; int _currentRoll; public: BowlingGame() : _score(0) , _currentRoll(0) {} void roll(int pins) { _score += pins; _rolls[_currentRoll++] = pins; } int score() { int score = 0; for (int i=0; i<21; ++i) { score += _rolls[i]; } return score; } };
will this pass?
![Page 117: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/117.jpg)
Olve Maudal Test-Driven Development January 2007
The Third Test class BowlingGameTest : public QUnit { public: BowlingGameTest() : QUnit("BowlingGameTest") {}; void run() { RUNTEST(testGutterGame); RUNTEST(testAllOnes); // RUNTEST(testOneSpare); } void rollMany(BowlingGame& g, int n, int pins) { for (int i=0; i<n; ++i) { g.roll(pins); } } void testGutterGame() { BowlingGame g; rollMany(g,20,0); ASSERT_TRUE(g.score() == 0); } void testAllOnes() { BowlingGame g; rollMany(g,20,1); ASSERT_TRUE(g.score() == 20); } // void testOneSpare() { // BowlingGame g; // g.roll(5); // g.roll(5); // spare // g.roll(3); // rollMany(g, 17, 0); // ASSERT_TRUE(g.score() == 16); // } };
class BowlingGame { int _score; int _rolls[21]; int _currentRoll; public: BowlingGame() : _score(0) , _currentRoll(0) {} void roll(int pins) { _score += pins; _rolls[_currentRoll++] = pins; } int score() { int score = 0; for (int i=0; i<21; ++i) { score += _rolls[i]; } return score; } };
yes
![Page 118: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/118.jpg)
Olve Maudal Test-Driven Development January 2007
The Third Test class BowlingGameTest : public QUnit { public: BowlingGameTest() : QUnit("BowlingGameTest") {}; void run() { RUNTEST(testGutterGame); RUNTEST(testAllOnes); // RUNTEST(testOneSpare); } void rollMany(BowlingGame& g, int n, int pins) { for (int i=0; i<n; ++i) { g.roll(pins); } } void testGutterGame() { BowlingGame g; rollMany(g,20,0); ASSERT_TRUE(g.score() == 0); } void testAllOnes() { BowlingGame g; rollMany(g,20,1); ASSERT_TRUE(g.score() == 20); } // void testOneSpare() { // BowlingGame g; // g.roll(5); // g.roll(5); // spare // g.roll(3); // rollMany(g, 17, 0); // ASSERT_TRUE(g.score() == 16); // } };
class BowlingGame { int _score; int _rolls[21]; int _currentRoll; public: BowlingGame() : _score(0) , _currentRoll(0) {} void roll(int pins) { _score += pins; _rolls[_currentRoll++] = pins; } int score() { int score = 0; for (int i=0; i<21; ++i) { score += _rolls[i]; } return score; } };
sometimes :-{
![Page 119: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/119.jpg)
Olve Maudal Test-Driven Development January 2007
The Third Test class BowlingGameTest : public QUnit { public: BowlingGameTest() : QUnit("BowlingGameTest") {}; void run() { RUNTEST(testGutterGame); RUNTEST(testAllOnes); // RUNTEST(testOneSpare); } void rollMany(BowlingGame& g, int n, int pins) { for (int i=0; i<n; ++i) { g.roll(pins); } } void testGutterGame() { BowlingGame g; rollMany(g,20,0); ASSERT_TRUE(g.score() == 0); } void testAllOnes() { BowlingGame g; rollMany(g,20,1); ASSERT_TRUE(g.score() == 20); } // void testOneSpare() { // BowlingGame g; // g.roll(5); // g.roll(5); // spare // g.roll(3); // rollMany(g, 17, 0); // ASSERT_TRUE(g.score() == 16); // } };
class BowlingGame { const static int MAX_ROLLS = 21; int _score; int _rolls[MAX_ROLLS]; int _currentRoll; public: BowlingGame() : _score(0) , _currentRoll(0) { for (int i=0; i<MAX_ROLLS; ++i) { _rolls[i] = 0; } } void roll(int pins) { _score += pins; _rolls[_currentRoll++] = pins; } int score() { int score = 0; for (int i=0; i<MAX_ROLLS; ++i) { score += _rolls[i]; } return score; } };
![Page 120: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/120.jpg)
Olve Maudal Test-Driven Development January 2007
The Third Test class BowlingGameTest : public QUnit { public: BowlingGameTest() : QUnit("BowlingGameTest") {}; void run() { RUNTEST(testGutterGame); RUNTEST(testAllOnes); // RUNTEST(testOneSpare); } void rollMany(BowlingGame& g, int n, int pins) { for (int i=0; i<n; ++i) { g.roll(pins); } } void testGutterGame() { BowlingGame g; rollMany(g,20,0); ASSERT_TRUE(g.score() == 0); } void testAllOnes() { BowlingGame g; rollMany(g,20,1); ASSERT_TRUE(g.score() == 20); } // void testOneSpare() { // BowlingGame g; // g.roll(5); // g.roll(5); // spare // g.roll(3); // rollMany(g, 17, 0); // ASSERT_TRUE(g.score() == 16); // } };
class BowlingGame { const static int MAX_ROLLS = 21; int _score; int _rolls[MAX_ROLLS]; int _currentRoll; public: BowlingGame() : _score(0) , _currentRoll(0) { for (int i=0; i<MAX_ROLLS; ++i) { _rolls[i] = 0; } } void roll(int pins) { _score += pins; _rolls[_currentRoll++] = pins; } int score() { int score = 0; for (int i=0; i<MAX_ROLLS; ++i) { score += _rolls[i]; } return score; } };
![Page 121: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/121.jpg)
Olve Maudal Test-Driven Development January 2007
The Third Test class BowlingGameTest : public QUnit { public: BowlingGameTest() : QUnit("BowlingGameTest") {}; void run() { RUNTEST(testGutterGame); RUNTEST(testAllOnes); // RUNTEST(testOneSpare); } void rollMany(BowlingGame& g, int n, int pins) { for (int i=0; i<n; ++i) { g.roll(pins); } } void testGutterGame() { BowlingGame g; rollMany(g,20,0); ASSERT_TRUE(g.score() == 0); } void testAllOnes() { BowlingGame g; rollMany(g,20,1); ASSERT_TRUE(g.score() == 20); } // void testOneSpare() { // BowlingGame g; // g.roll(5); // g.roll(5); // spare // g.roll(3); // rollMany(g, 17, 0); // ASSERT_TRUE(g.score() == 16); // } };
class BowlingGame { const static int MAX_ROLLS = 21; int _score; int _rolls[MAX_ROLLS]; int _currentRoll; public: BowlingGame() : _score(0) , _currentRoll(0) { for (int i=0; i<MAX_ROLLS; ++i) { _rolls[i] = 0; } } void roll(int pins) { _score += pins; _rolls[_currentRoll++] = pins; } int score() { int score = 0; for (int i=0; i<MAX_ROLLS; ++i) { score += _rolls[i]; } return score; } };
![Page 122: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/122.jpg)
Olve Maudal Test-Driven Development January 2007
The Third Test class BowlingGameTest : public QUnit { public: BowlingGameTest() : QUnit("BowlingGameTest") {}; void run() { RUNTEST(testGutterGame); RUNTEST(testAllOnes); // RUNTEST(testOneSpare); } void rollMany(BowlingGame& g, int n, int pins) { for (int i=0; i<n; ++i) { g.roll(pins); } } void testGutterGame() { BowlingGame g; rollMany(g,20,0); ASSERT_TRUE(g.score() == 0); } void testAllOnes() { BowlingGame g; rollMany(g,20,1); ASSERT_TRUE(g.score() == 20); } // void testOneSpare() { // BowlingGame g; // g.roll(5); // g.roll(5); // spare // g.roll(3); // rollMany(g, 17, 0); // ASSERT_TRUE(g.score() == 16); // } };
class BowlingGame { const static int MAX_ROLLS = 21; int _rolls[MAX_ROLLS]; int _currentRoll; public: BowlingGame() : _currentRoll(0) { for (int i=0; i<MAX_ROLLS; ++i) { _rolls[i] = 0; } } void roll(int pins) { _rolls[_currentRoll++] = pins; } int score() { int score = 0; for (int i=0; i<MAX_ROLLS; ++i) { score += _rolls[i]; } return score; } };
![Page 123: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/123.jpg)
Olve Maudal Test-Driven Development January 2007
The Third Test class BowlingGameTest : public QUnit { public: BowlingGameTest() : QUnit("BowlingGameTest") {}; void run() { RUNTEST(testGutterGame); RUNTEST(testAllOnes); RUNTEST(testOneSpare); } void rollMany(BowlingGame& g, int n, int pins) { for (int i=0; i<n; ++i) { g.roll(pins); } } void testGutterGame() { BowlingGame g; rollMany(g,20,0); ASSERT_TRUE(g.score() == 0); } void testAllOnes() { BowlingGame g; rollMany(g,20,1); ASSERT_TRUE(g.score() == 20); } void testOneSpare() { BowlingGame g; g.roll(5); g.roll(5); // spare g.roll(3); rollMany(g, 17, 0); ASSERT_TRUE(g.score() == 16); } };
class BowlingGame { const static int MAX_ROLLS = 21; int _rolls[MAX_ROLLS]; int _currentRoll; public: BowlingGame() : _currentRoll(0) { for (int i=0; i<MAX_ROLLS; ++i) { _rolls[i] = 0; } } void roll(int pins) { _rolls[_currentRoll++] = pins; } int score() { int score = 0; for (int i=0; i<MAX_ROLLS; ++i) { score += _rolls[i]; } return score; } };
![Page 124: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/124.jpg)
Olve Maudal Test-Driven Development January 2007
The Third Test class BowlingGameTest : public QUnit { public: BowlingGameTest() : QUnit("BowlingGameTest") {}; void run() { RUNTEST(testGutterGame); RUNTEST(testAllOnes); RUNTEST(testOneSpare); } void rollMany(BowlingGame& g, int n, int pins) { for (int i=0; i<n; ++i) { g.roll(pins); } } void testGutterGame() { BowlingGame g; rollMany(g,20,0); ASSERT_TRUE(g.score() == 0); } void testAllOnes() { BowlingGame g; rollMany(g,20,1); ASSERT_TRUE(g.score() == 20); } void testOneSpare() { BowlingGame g; g.roll(5); g.roll(5); // spare g.roll(3); rollMany(g, 17, 0); ASSERT_TRUE(g.score() == 16); } };
class BowlingGame { const static int MAX_ROLLS = 21; int _rolls[MAX_ROLLS]; int _currentRoll; public: BowlingGame() : _currentRoll(0) { for (int i=0; i<MAX_ROLLS; ++i) { _rolls[i] = 0; } } void roll(int pins) { _rolls[_currentRoll++] = pins; } int score() { int score = 0; for (int i=0; i<MAX_ROLLS; ++i) { score += _rolls[i]; } return score; } };
BowlingGameTest.cpp:44: unittest failed: g.score() == 16 (BowlingGameTest/testOneSpare/1) BowlingGameTest FAILED (3 tests, 1 errors)
![Page 125: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/125.jpg)
Olve Maudal Test-Driven Development January 2007
The Third Test class BowlingGameTest : public QUnit { public: BowlingGameTest() : QUnit("BowlingGameTest") {}; void run() { RUNTEST(testGutterGame); RUNTEST(testAllOnes); RUNTEST(testOneSpare); } void rollMany(BowlingGame& g, int n, int pins) { for (int i=0; i<n; ++i) { g.roll(pins); } } void testGutterGame() { BowlingGame g; rollMany(g,20,0); ASSERT_TRUE(g.score() == 0); } void testAllOnes() { BowlingGame g; rollMany(g,20,1); ASSERT_TRUE(g.score() == 20); } void testOneSpare() { BowlingGame g; g.roll(5); g.roll(5); // spare g.roll(3); rollMany(g, 17, 0); ASSERT_TRUE(g.score() == 16); } };
class BowlingGame { const static int MAX_ROLLS = 21; int _rolls[MAX_ROLLS]; int _currentRoll; public: BowlingGame() : _currentRoll(0) { for (int i=0; i<MAX_ROLLS; ++i) { _rolls[i] = 0; } } void roll(int pins) { _rolls[_currentRoll++] = pins; } int score() { int score = 0; for (int i=0; i<MAX_ROLLS; ++i) { if (rolls[i] + rolls[i+1] == 10) { // spare score += ... score += _rolls[i]; } return score; } };
![Page 126: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/126.jpg)
Olve Maudal Test-Driven Development January 2007
The Third Test class BowlingGameTest : public QUnit { public: BowlingGameTest() : QUnit("BowlingGameTest") {}; void run() { RUNTEST(testGutterGame); RUNTEST(testAllOnes); RUNTEST(testOneSpare); } void rollMany(BowlingGame& g, int n, int pins) { for (int i=0; i<n; ++i) { g.roll(pins); } } void testGutterGame() { BowlingGame g; rollMany(g,20,0); ASSERT_TRUE(g.score() == 0); } void testAllOnes() { BowlingGame g; rollMany(g,20,1); ASSERT_TRUE(g.score() == 20); } void testOneSpare() { BowlingGame g; g.roll(5); g.roll(5); // spare g.roll(3); rollMany(g, 17, 0); ASSERT_TRUE(g.score() == 16); } };
class BowlingGame { const static int MAX_ROLLS = 21; int _rolls[MAX_ROLLS]; int _currentRoll; public: BowlingGame() : _currentRoll(0) { for (int i=0; i<MAX_ROLLS; ++i) { _rolls[i] = 0; } } void roll(int pins) { _rolls[_currentRoll++] = pins; } int score() { int score = 0; for (int i=0; i<MAX_ROLLS; ++i) { if (rolls[i] + rolls[i+1] == 10) { // spare score += ... score += _rolls[i]; } return score; } };
This isn’t going to work because i might not refer to the first ball of the frame. Design is still wrong. Need to walk through array two balls (one frame) at a time.
![Page 127: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/127.jpg)
Olve Maudal Test-Driven Development January 2007
The Third Test class BowlingGameTest : public QUnit { public: BowlingGameTest() : QUnit("BowlingGameTest") {}; void run() { RUNTEST(testGutterGame); RUNTEST(testAllOnes); // RUNTEST(testOneSpare); } void rollMany(BowlingGame& g, int n, int pins) { for (int i=0; i<n; ++i) { g.roll(pins); } } void testGutterGame() { BowlingGame g; rollMany(g,20,0); ASSERT_TRUE(g.score() == 0); } void testAllOnes() { BowlingGame g; rollMany(g,20,1); ASSERT_TRUE(g.score() == 20); } // void testOneSpare() { // BowlingGame g; // g.roll(5); // g.roll(5); // spare // g.roll(3); // rollMany(g, 17, 0); // ASSERT_TRUE(g.score() == 16); // } };
class BowlingGame { const static int MAX_ROLLS = 21; int _rolls[MAX_ROLLS]; int _currentRoll; public: BowlingGame() : _currentRoll(0) { for (int i=0; i<MAX_ROLLS; ++i) { _rolls[i] = 0; } } void roll(int pins) { _rolls[_currentRoll++] = pins; } int score() { int score = 0; for (int i=0; i<MAX_ROLLS; ++i) { score += _rolls[i]; } return score; } };
![Page 128: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/128.jpg)
Olve Maudal Test-Driven Development January 2007
The Third Test class BowlingGameTest : public QUnit { public: BowlingGameTest() : QUnit("BowlingGameTest") {}; void run() { RUNTEST(testGutterGame); RUNTEST(testAllOnes); // RUNTEST(testOneSpare); } void rollMany(BowlingGame& g, int n, int pins) { for (int i=0; i<n; ++i) { g.roll(pins); } } void testGutterGame() { BowlingGame g; rollMany(g,20,0); ASSERT_TRUE(g.score() == 0); } void testAllOnes() { BowlingGame g; rollMany(g,20,1); ASSERT_TRUE(g.score() == 20); } // void testOneSpare() { // BowlingGame g; // g.roll(5); // g.roll(5); // spare // g.roll(3); // rollMany(g, 17, 0); // ASSERT_TRUE(g.score() == 16); // } };
class BowlingGame { const static int MAX_ROLLS = 21; int _rolls[MAX_ROLLS]; int _currentRoll; public: BowlingGame() : _currentRoll(0) { for (int i=0; i<MAX_ROLLS; ++i) { _rolls[i] = 0; } } void roll(int pins) { _rolls[_currentRoll++] = pins; } int score() { int score = 0; int i = 0; for (int frame=0; frame<10; ++frame) { score += _rolls[i] + _rolls[i+1]; i += 2; } return score; } };
![Page 129: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/129.jpg)
Olve Maudal Test-Driven Development January 2007
The Third Test class BowlingGameTest : public QUnit { public: BowlingGameTest() : QUnit("BowlingGameTest") {}; void run() { RUNTEST(testGutterGame); RUNTEST(testAllOnes); // RUNTEST(testOneSpare); } void rollMany(BowlingGame& g, int n, int pins) { for (int i=0; i<n; ++i) { g.roll(pins); } } void testGutterGame() { BowlingGame g; rollMany(g,20,0); ASSERT_TRUE(g.score() == 0); } void testAllOnes() { BowlingGame g; rollMany(g,20,1); ASSERT_TRUE(g.score() == 20); } // void testOneSpare() { // BowlingGame g; // g.roll(5); // g.roll(5); // spare // g.roll(3); // rollMany(g, 17, 0); // ASSERT_TRUE(g.score() == 16); // } };
class BowlingGame { const static int MAX_ROLLS = 21; int _rolls[MAX_ROLLS]; int _currentRoll; public: BowlingGame() : _currentRoll(0) { for (int i=0; i<MAX_ROLLS; ++i) { _rolls[i] = 0; } } void roll(int pins) { _rolls[_currentRoll++] = pins; } int score() { int score = 0; int i = 0; for (int frame=0; frame<10; ++frame) { score += _rolls[i] + _rolls[i+1]; i += 2; } return score; } };
![Page 130: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/130.jpg)
Olve Maudal Test-Driven Development January 2007
The Third Test class BowlingGameTest : public QUnit { public: BowlingGameTest() : QUnit("BowlingGameTest") {}; void run() { RUNTEST(testGutterGame); RUNTEST(testAllOnes); RUNTEST(testOneSpare); } void rollMany(BowlingGame& g, int n, int pins) { for (int i=0; i<n; ++i) { g.roll(pins); } } void testGutterGame() { BowlingGame g; rollMany(g,20,0); ASSERT_TRUE(g.score() == 0); } void testAllOnes() { BowlingGame g; rollMany(g,20,1); ASSERT_TRUE(g.score() == 20); } void testOneSpare() { BowlingGame g; g.roll(5); g.roll(5); // spare g.roll(3); rollMany(g, 17, 0); ASSERT_TRUE(g.score() == 16); } };
class BowlingGame { const static int MAX_ROLLS = 21; int _rolls[MAX_ROLLS]; int _currentRoll; public: BowlingGame() : _currentRoll(0) { for (int i=0; i<MAX_ROLLS; ++i) { _rolls[i] = 0; } } void roll(int pins) { _rolls[_currentRoll++] = pins; } int score() { int score = 0; int i = 0; for (int frame=0; frame<10; ++frame) { score += _rolls[i] + _rolls[i+1]; i += 2; } return score; } };
![Page 131: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/131.jpg)
Olve Maudal Test-Driven Development January 2007
The Third Test class BowlingGameTest : public QUnit { public: BowlingGameTest() : QUnit("BowlingGameTest") {}; void run() { RUNTEST(testGutterGame); RUNTEST(testAllOnes); RUNTEST(testOneSpare); } void rollMany(BowlingGame& g, int n, int pins) { for (int i=0; i<n; ++i) { g.roll(pins); } } void testGutterGame() { BowlingGame g; rollMany(g,20,0); ASSERT_TRUE(g.score() == 0); } void testAllOnes() { BowlingGame g; rollMany(g,20,1); ASSERT_TRUE(g.score() == 20); } void testOneSpare() { BowlingGame g; g.roll(5); g.roll(5); // spare g.roll(3); rollMany(g, 17, 0); ASSERT_TRUE(g.score() == 16); } };
BowlingGameTest.cpp:44: unittest failed: g.score() == 16 (BowlingGameTest/testOneSpare/1) BowlingGameTest FAILED (3 tests, 1 errors)
class BowlingGame { const static int MAX_ROLLS = 21; int _rolls[MAX_ROLLS]; int _currentRoll; public: BowlingGame() : _currentRoll(0) { for (int i=0; i<MAX_ROLLS; ++i) { _rolls[i] = 0; } } void roll(int pins) { _rolls[_currentRoll++] = pins; } int score() { int score = 0; int i = 0; for (int frame=0; frame<10; ++frame) { score += _rolls[i] + _rolls[i+1]; i += 2; } return score; } };
![Page 132: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/132.jpg)
Olve Maudal Test-Driven Development January 2007
The Third Test class BowlingGameTest : public QUnit { public: BowlingGameTest() : QUnit("BowlingGameTest") {}; void run() { RUNTEST(testGutterGame); RUNTEST(testAllOnes); RUNTEST(testOneSpare); } void rollMany(BowlingGame& g, int n, int pins) { for (int i=0; i<n; ++i) { g.roll(pins); } } void testGutterGame() { BowlingGame g; rollMany(g,20,0); ASSERT_TRUE(g.score() == 0); } void testAllOnes() { BowlingGame g; rollMany(g,20,1); ASSERT_TRUE(g.score() == 20); } void testOneSpare() { BowlingGame g; g.roll(5); g.roll(5); // spare g.roll(3); rollMany(g, 17, 0); ASSERT_TRUE(g.score() == 16); } };
class BowlingGame { const static int MAX_ROLLS = 21; int _rolls[MAX_ROLLS]; int _currentRoll; public: BowlingGame() : _currentRoll(0) { for (int i=0; i<MAX_ROLLS; ++i) { _rolls[i] = 0; } } void roll(int pins) { _rolls[_currentRoll++] = pins; } int score() { int score = 0; int i = 0; for (int frame=0; frame<10; ++frame) { if ( _rolls[i] + _rolls[i+1] == 10 ) { // spare score += 10 + _rolls[i+2]; i += 2; } else { score += _rolls[i] + _rolls[i+1]; i += 2; } } return score; } };
![Page 133: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/133.jpg)
Olve Maudal Test-Driven Development January 2007
The Third Test class BowlingGameTest : public QUnit { public: BowlingGameTest() : QUnit("BowlingGameTest") {}; void run() { RUNTEST(testGutterGame); RUNTEST(testAllOnes); RUNTEST(testOneSpare); } void rollMany(BowlingGame& g, int n, int pins) { for (int i=0; i<n; ++i) { g.roll(pins); } } void testGutterGame() { BowlingGame g; rollMany(g,20,0); ASSERT_TRUE(g.score() == 0); } void testAllOnes() { BowlingGame g; rollMany(g,20,1); ASSERT_TRUE(g.score() == 20); } void testOneSpare() { BowlingGame g; g.roll(5); g.roll(5); // spare g.roll(3); rollMany(g, 17, 0); ASSERT_TRUE(g.score() == 16); } };
class BowlingGame { const static int MAX_ROLLS = 21; int _rolls[MAX_ROLLS]; int _currentRoll; public: BowlingGame() : _currentRoll(0) { for (int i=0; i<MAX_ROLLS; ++i) { _rolls[i] = 0; } } void roll(int pins) { _rolls[_currentRoll++] = pins; } int score() { int score = 0; int i = 0; for (int frame=0; frame<10; ++frame) { if ( _rolls[i] + _rolls[i+1] == 10 ) { // spare score += 10 + _rolls[i+2]; i += 2; } else { score += _rolls[i] + _rolls[i+1]; i += 2; } } return score; } };
OK BowlingGameTest/testGutterGame/1 OK BowlingGameTest/testAllOnes/1 OK BowlingGameTest/testOneSpare/1 BowlingGameTest OK (3 tests, 0 errors)
![Page 134: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/134.jpg)
Olve Maudal Test-Driven Development January 2007
The Third Test class BowlingGameTest : public QUnit { public: BowlingGameTest() : QUnit("BowlingGameTest") {}; void run() { RUNTEST(testGutterGame); RUNTEST(testAllOnes); RUNTEST(testOneSpare); } void rollMany(BowlingGame& g, int n, int pins) { for (int i=0; i<n; ++i) { g.roll(pins); } } void testGutterGame() { BowlingGame g; rollMany(g,20,0); ASSERT_TRUE(g.score() == 0); } void testAllOnes() { BowlingGame g; rollMany(g,20,1); ASSERT_TRUE(g.score() == 20); } void testOneSpare() { BowlingGame g; g.roll(5); g.roll(5); // spare g.roll(3); rollMany(g, 17, 0); ASSERT_TRUE(g.score() == 16); } };
class BowlingGame { const static int MAX_ROLLS = 21; int _rolls[MAX_ROLLS]; int _currentRoll; public: BowlingGame() : _currentRoll(0) { for (int i=0; i<MAX_ROLLS; ++i) { _rolls[i] = 0; } } void roll(int pins) { _rolls[_currentRoll++] = pins; } int score() { int score = 0; int i = 0; for (int frame=0; frame<10; ++frame) { if ( _rolls[i] + _rolls[i+1] == 10 ) { // spare score += 10 + _rolls[i+2]; i += 2; } else { score += _rolls[i] + _rolls[i+1]; i += 2; } } return score; } };
bad name for variable
ugly comment in conditional
![Page 135: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/135.jpg)
Olve Maudal Test-Driven Development January 2007
The Third Test class BowlingGameTest : public QUnit { public: BowlingGameTest() : QUnit("BowlingGameTest") {}; void run() { RUNTEST(testGutterGame); RUNTEST(testAllOnes); RUNTEST(testOneSpare); } void rollMany(BowlingGame& g, int n, int pins) { for (int i=0; i<n; ++i) { g.roll(pins); } } void testGutterGame() { BowlingGame g; rollMany(g,20,0); ASSERT_TRUE(g.score() == 0); } void testAllOnes() { BowlingGame g; rollMany(g,20,1); ASSERT_TRUE(g.score() == 20); } void testOneSpare() { BowlingGame g; g.roll(5); g.roll(5); // spare g.roll(3); rollMany(g, 17, 0); ASSERT_TRUE(g.score() == 16); } };
class BowlingGame { const static int MAX_ROLLS = 21; int _rolls[MAX_ROLLS]; int _currentRoll; public: BowlingGame() : _currentRoll(0) { for (int i=0; i<MAX_ROLLS; ++i) { _rolls[i] = 0; } } void roll(int pins) { _rolls[_currentRoll++] = pins; } int score() { int score = 0; int i = 0; for (int frame=0; frame<10; ++frame) { if ( _rolls[i] + _rolls[i+1] == 10 ) { // spare score += 10 + _rolls[i+2]; i += 2; } else { score += _rolls[i] + _rolls[i+1]; i += 2; } } return score; } };
![Page 136: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/136.jpg)
Olve Maudal Test-Driven Development January 2007
The Third Test class BowlingGameTest : public QUnit { public: BowlingGameTest() : QUnit("BowlingGameTest") {}; void run() { RUNTEST(testGutterGame); RUNTEST(testAllOnes); RUNTEST(testOneSpare); } void rollMany(BowlingGame& g, int n, int pins) { for (int i=0; i<n; ++i) { g.roll(pins); } } void testGutterGame() { BowlingGame g; rollMany(g,20,0); ASSERT_TRUE(g.score() == 0); } void testAllOnes() { BowlingGame g; rollMany(g,20,1); ASSERT_TRUE(g.score() == 20); } void testOneSpare() { BowlingGame g; g.roll(5); g.roll(5); // spare g.roll(3); rollMany(g, 17, 0); ASSERT_TRUE(g.score() == 16); } };
class BowlingGame { const static int MAX_ROLLS = 21; int _rolls[MAX_ROLLS]; int _currentRoll; public: BowlingGame() : _currentRoll(0) { for (int i=0; i<MAX_ROLLS; ++i) { _rolls[i] = 0; } } void roll(int pins) { _rolls[_currentRoll++] = pins; } int score() { int score = 0; int frameIndex = 0; for (int frame=0; frame<10; ++frame) { if ( _rolls[frameIndex] + _rolls[frameIndex+1] == 10 ) { // spare score += 10 + _rolls[frameIndex+2]; frameIndex += 2; } else { score += _rolls[frameIndex] + _rolls[frameIndex+1]; frameIndex += 2; } } return score; } };
![Page 137: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/137.jpg)
Olve Maudal Test-Driven Development January 2007
The Third Test class BowlingGameTest : public QUnit { public: BowlingGameTest() : QUnit("BowlingGameTest") {}; void run() { RUNTEST(testGutterGame); RUNTEST(testAllOnes); RUNTEST(testOneSpare); } void rollMany(BowlingGame& g, int n, int pins) { for (int i=0; i<n; ++i) { g.roll(pins); } } void testGutterGame() { BowlingGame g; rollMany(g,20,0); ASSERT_TRUE(g.score() == 0); } void testAllOnes() { BowlingGame g; rollMany(g,20,1); ASSERT_TRUE(g.score() == 20); } void testOneSpare() { BowlingGame g; g.roll(5); g.roll(5); // spare g.roll(3); rollMany(g, 17, 0); ASSERT_TRUE(g.score() == 16); } };
class BowlingGame { const static int MAX_ROLLS = 21; int _rolls[MAX_ROLLS]; int _currentRoll; public: BowlingGame() : _currentRoll(0) { for (int i=0; i<MAX_ROLLS; ++i) { _rolls[i] = 0; } } void roll(int pins) { _rolls[_currentRoll++] = pins; } int score() { int score = 0; int frameIndex = 0; for (int frame=0; frame<10; ++frame) { if ( _rolls[frameIndex] + _rolls[frameIndex+1] == 10 ) { // spare score += 10 + _rolls[frameIndex+2]; frameIndex += 2; } else { score += _rolls[frameIndex] + _rolls[frameIndex+1]; frameIndex += 2; } } return score; } };
![Page 138: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/138.jpg)
Olve Maudal Test-Driven Development January 2007
The Third Test class BowlingGameTest : public QUnit { public: BowlingGameTest() : QUnit("BowlingGameTest") {}; void run() { RUNTEST(testGutterGame); RUNTEST(testAllOnes); RUNTEST(testOneSpare); } void rollMany(BowlingGame& g, int n, int pins) { for (int i=0; i<n; ++i) { g.roll(pins); } } void testGutterGame() { BowlingGame g; rollMany(g,20,0); ASSERT_TRUE(g.score() == 0); } void testAllOnes() { BowlingGame g; rollMany(g,20,1); ASSERT_TRUE(g.score() == 20); } void testOneSpare() { BowlingGame g; g.roll(5); g.roll(5); // spare g.roll(3); rollMany(g, 17, 0); ASSERT_TRUE(g.score() == 16); } };
class BowlingGame { const static int MAX_ROLLS = 21; int _rolls[MAX_ROLLS]; int _currentRoll; public: BowlingGame() : _currentRoll(0) { for (int i=0; i<MAX_ROLLS; ++i) { _rolls[i] = 0; } } void roll(int pins) { _rolls[_currentRoll++] = pins; } int score() { int score = 0; int frameIndex = 0; for (int frame=0; frame<10; ++frame) { if ( _rolls[frameIndex] + _rolls[frameIndex+1] == 10 ) { // spare score += 10 + _rolls[frameIndex+2]; frameIndex += 2; } else { score += _rolls[frameIndex] + _rolls[frameIndex+1]; frameIndex += 2; } } return score; } };
ugly comment in conditional
![Page 139: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/139.jpg)
Olve Maudal Test-Driven Development January 2007
The Third Test class BowlingGameTest : public QUnit { public: BowlingGameTest() : QUnit("BowlingGameTest") {}; void run() { RUNTEST(testGutterGame); RUNTEST(testAllOnes); RUNTEST(testOneSpare); } void rollMany(BowlingGame& g, int n, int pins) { for (int i=0; i<n; ++i) { g.roll(pins); } } void testGutterGame() { BowlingGame g; rollMany(g,20,0); ASSERT_TRUE(g.score() == 0); } void testAllOnes() { BowlingGame g; rollMany(g,20,1); ASSERT_TRUE(g.score() == 20); } void testOneSpare() { BowlingGame g; g.roll(5); g.roll(5); // spare g.roll(3); rollMany(g, 17, 0); ASSERT_TRUE(g.score() == 16); } };
class BowlingGame { const static int MAX_ROLLS = 21; int _rolls[MAX_ROLLS]; int _currentRoll; bool isSpare(int frameIndex) { return _rolls[frameIndex] + _rolls[frameIndex+1] == 10; } public: BowlingGame() : _currentRoll(0) { for (int i=0; i<MAX_ROLLS; ++i) { _rolls[i] = 0; } } void roll(int pins) { _rolls[_currentRoll++] = pins; } int score() { int score = 0; int frameIndex = 0; for (int frame=0; frame<10; ++frame) { if ( isSpare(frameIndex) ) { score += 10 + _rolls[frameIndex+2]; frameIndex += 2; } else { score += _rolls[frameIndex] + _rolls[frameIndex+1]; frameIndex += 2; } } return score; } };
![Page 140: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/140.jpg)
Olve Maudal Test-Driven Development January 2007
The Third Test class BowlingGameTest : public QUnit { public: BowlingGameTest() : QUnit("BowlingGameTest") {}; void run() { RUNTEST(testGutterGame); RUNTEST(testAllOnes); RUNTEST(testOneSpare); } void rollMany(BowlingGame& g, int n, int pins) { for (int i=0; i<n; ++i) { g.roll(pins); } } void testGutterGame() { BowlingGame g; rollMany(g,20,0); ASSERT_TRUE(g.score() == 0); } void testAllOnes() { BowlingGame g; rollMany(g,20,1); ASSERT_TRUE(g.score() == 20); } void testOneSpare() { BowlingGame g; g.roll(5); g.roll(5); // spare g.roll(3); rollMany(g, 17, 0); ASSERT_TRUE(g.score() == 16); } };
class BowlingGame { const static int MAX_ROLLS = 21; int _rolls[MAX_ROLLS]; int _currentRoll; bool isSpare(int frameIndex) { return _rolls[frameIndex] + _rolls[frameIndex+1] == 10; } public: BowlingGame() : _currentRoll(0) { for (int i=0; i<MAX_ROLLS; ++i) { _rolls[i] = 0; } } void roll(int pins) { _rolls[_currentRoll++] = pins; } int score() { int score = 0; int frameIndex = 0; for (int frame=0; frame<10; ++frame) { if ( isSpare(frameIndex) ) { score += 10 + _rolls[frameIndex+2]; frameIndex += 2; } else { score += _rolls[frameIndex] + _rolls[frameIndex+1]; frameIndex += 2; } } return score; } };
![Page 141: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/141.jpg)
Olve Maudal Test-Driven Development January 2007
The Third Test class BowlingGameTest : public QUnit { public: BowlingGameTest() : QUnit("BowlingGameTest") {}; void run() { RUNTEST(testGutterGame); RUNTEST(testAllOnes); RUNTEST(testOneSpare); } void rollMany(BowlingGame& g, int n, int pins) { for (int i=0; i<n; ++i) { g.roll(pins); } } void testGutterGame() { BowlingGame g; rollMany(g,20,0); ASSERT_TRUE(g.score() == 0); } void testAllOnes() { BowlingGame g; rollMany(g,20,1); ASSERT_TRUE(g.score() == 20); } void testOneSpare() { BowlingGame g; g.roll(5); g.roll(5); // spare g.roll(3); rollMany(g, 17, 0); ASSERT_TRUE(g.score() == 16); } };
class BowlingGame { const static int MAX_ROLLS = 21; int _rolls[MAX_ROLLS]; int _currentRoll; bool isSpare(int frameIndex) { return _rolls[frameIndex] + _rolls[frameIndex+1] == 10; } public: BowlingGame() : _currentRoll(0) { for (int i=0; i<MAX_ROLLS; ++i) { _rolls[i] = 0; } } void roll(int pins) { _rolls[_currentRoll++] = pins; } int score() { int score = 0; int frameIndex = 0; for (int frame=0; frame<10; ++frame) { if ( isSpare(frameIndex) ) { score += 10 + _rolls[frameIndex+2]; frameIndex += 2; } else { score += _rolls[frameIndex] + _rolls[frameIndex+1]; frameIndex += 2; } } return score; } };
![Page 142: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/142.jpg)
Olve Maudal Test-Driven Development January 2007
The Fourth Test
![Page 143: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/143.jpg)
Olve Maudal Test-Driven Development January 2007
The Fourth Test // ... void testOneSpare() { BowlingGame g; g.roll(5); g.roll(5); // spare g.roll(3); rollMany(g, 17, 0); ASSERT_TRUE(g.score() == 16); } void testOneStrike() { BowlingGame g; g.roll(10); // strike g.roll(3); g.roll(4); rollMany(g, 16, 0); ASSERT_TRUE(g.score() == 24); } // ...
class BowlingGame { const static int MAX_ROLLS = 21; int _rolls[MAX_ROLLS]; int _currentRoll; bool isSpare(int frameIndex) { return _rolls[frameIndex] + _rolls[frameIndex+1] == 10; } public: BowlingGame() : _currentRoll(0) { for (int i=0; i<MAX_ROLLS; ++i) { _rolls[i] = 0; } } void roll(int pins) { _rolls[_currentRoll++] = pins; } int score() { int score = 0; int frameIndex = 0; for (int frame=0; frame<10; ++frame) { if ( isSpare(frameIndex) ) { score += 10 + _rolls[frameIndex+2]; frameIndex += 2; } else { score += _rolls[frameIndex] + _rolls[frameIndex+1]; frameIndex += 2; } } return score; } };
![Page 144: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/144.jpg)
Olve Maudal Test-Driven Development January 2007
The Fourth Test // ... void testOneSpare() { BowlingGame g; g.roll(5); g.roll(5); // spare g.roll(3); rollMany(g, 17, 0); ASSERT_TRUE(g.score() == 16); } void testOneStrike() { BowlingGame g; g.roll(10); // strike g.roll(3); g.roll(4); rollMany(g, 16, 0); ASSERT_TRUE(g.score() == 24); } // ...
class BowlingGame { const static int MAX_ROLLS = 21; int _rolls[MAX_ROLLS]; int _currentRoll; bool isSpare(int frameIndex) { return _rolls[frameIndex] + _rolls[frameIndex+1] == 10; } public: BowlingGame() : _currentRoll(0) { for (int i=0; i<MAX_ROLLS; ++i) { _rolls[i] = 0; } } void roll(int pins) { _rolls[_currentRoll++] = pins; } int score() { int score = 0; int frameIndex = 0; for (int frame=0; frame<10; ++frame) { if ( isSpare(frameIndex) ) { score += 10 + _rolls[frameIndex+2]; frameIndex += 2; } else { score += _rolls[frameIndex] + _rolls[frameIndex+1]; frameIndex += 2; } } return score; } };
OK BowlingGameTest/testGutterGame/1 OK BowlingGameTest/testAllOnes/1 OK BowlingGameTest/testOneSpare/1 ERROR BowlingGameTest/testOneStrike/1 BowlingGameTest.cpp:54: unittest failed: g.score() == 24 (BowlingGameTest/testOneStrike/1)
![Page 145: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/145.jpg)
Olve Maudal Test-Driven Development January 2007
The Fourth Test // ... void testOneSpare() { BowlingGame g; g.roll(5); g.roll(5); // spare g.roll(3); rollMany(g, 17, 0); ASSERT_TRUE(g.score() == 16); } void testOneStrike() { BowlingGame g; g.roll(10); // strike g.roll(3); g.roll(4); rollMany(g, 16, 0); ASSERT_TRUE(g.score() == 24); } // ...
class BowlingGame { const static int MAX_ROLLS = 21; int _rolls[MAX_ROLLS]; int _currentRoll; bool isSpare(int frameIndex) { return _rolls[frameIndex] + _rolls[frameIndex+1] == 10; } bool isStrike(int frameIndex) { return _rolls[frameIndex] == 10; } public: BowlingGame() : _currentRoll(0) { for (int i=0; i<MAX_ROLLS; ++i) { _rolls[i] = 0; } } void roll(int pins) { _rolls[_currentRoll++] = pins; } int score() { int score = 0; int frameIndex = 0; for (int frame=0; frame<10; ++frame) { if ( isStrike(frameIndex) ) { score += 10 + _rolls[frameIndex+1] + _rolls[frameIndex+2]; frameIndex += 1; } else if ( isSpare(frameIndex) ) { score += 10 + _rolls[frameIndex+2]; frameIndex += 2; } else { score += _rolls[frameIndex] + _rolls[frameIndex+1]; frameIndex += 2; } } return score; } };
![Page 146: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/146.jpg)
Olve Maudal Test-Driven Development January 2007
The Fourth Test // ... void testOneSpare() { BowlingGame g; g.roll(5); g.roll(5); // spare g.roll(3); rollMany(g, 17, 0); ASSERT_TRUE(g.score() == 16); } void testOneStrike() { BowlingGame g; g.roll(10); // strike g.roll(3); g.roll(4); rollMany(g, 16, 0); ASSERT_TRUE(g.score() == 24); } // ...
class BowlingGame { const static int MAX_ROLLS = 21; int _rolls[MAX_ROLLS]; int _currentRoll; bool isSpare(int frameIndex) { return _rolls[frameIndex] + _rolls[frameIndex+1] == 10; } bool isStrike(int frameIndex) { return _rolls[frameIndex] == 10; } public: BowlingGame() : _currentRoll(0) { for (int i=0; i<MAX_ROLLS; ++i) { _rolls[i] = 0; } } void roll(int pins) { _rolls[_currentRoll++] = pins; } int score() { int score = 0; int frameIndex = 0; for (int frame=0; frame<10; ++frame) { if ( isStrike(frameIndex) ) { score += 10 + _rolls[frameIndex+1] + _rolls[frameIndex+2]; frameIndex += 1; } else if ( isSpare(frameIndex) ) { score += 10 + _rolls[frameIndex+2]; frameIndex += 2; } else { score += _rolls[frameIndex] + _rolls[frameIndex+1]; frameIndex += 2; } } return score; } };
![Page 147: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/147.jpg)
Olve Maudal Test-Driven Development January 2007
The Fourth Test // ... void testOneSpare() { BowlingGame g; g.roll(5); g.roll(5); // spare g.roll(3); rollMany(g, 17, 0); ASSERT_TRUE(g.score() == 16); } void testOneStrike() { BowlingGame g; g.roll(10); // strike g.roll(3); g.roll(4); rollMany(g, 16, 0); ASSERT_TRUE(g.score() == 24); } // ...
// ... private: bool isSpare(int frameIndex) { return _rolls[frameIndex] + _rolls[frameIndex+1] == 10; } bool isStrike(int frameIndex) { return _rolls[frameIndex] == 10; } int strikeBonus(int frameIndex) { return _rolls[frameIndex+1] + _rolls[frameIndex+2]; } int spareBonus(int frameIndex) { return _rolls[frameIndex+2]; } int sumOfRollsInFrame(int frameIndex) { return _rolls[frameIndex] + _rolls[frameIndex+1]; } public: // ... int score() { int score = 0; int frameIndex = 0; for (int frame=0; frame<10; ++frame) { if ( isStrike(frameIndex) ) { score += 10 + strikeBonus(frameIndex); frameIndex += 1; } else if ( isSpare(frameIndex) ) { score += 10 + spareBonus(frameIndex); frameIndex += 2; } else { score += sumOfRollsInFrame(frameIndex); frameIndex += 2; } } return score; }
![Page 148: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/148.jpg)
Olve Maudal Test-Driven Development January 2007
The Fourth Test // ... void testOneSpare() { BowlingGame g; g.roll(5); g.roll(5); // spare g.roll(3); rollMany(g, 17, 0); ASSERT_TRUE(g.score() == 16); } void testOneStrike() { BowlingGame g; g.roll(10); // strike g.roll(3); g.roll(4); rollMany(g, 16, 0); ASSERT_TRUE(g.score() == 24); } // ...
// ... private: bool isSpare(int frameIndex) { return _rolls[frameIndex] + _rolls[frameIndex+1] == 10; } bool isStrike(int frameIndex) { return _rolls[frameIndex] == 10; } int strikeBonus(int frameIndex) { return _rolls[frameIndex+1] + _rolls[frameIndex+2]; } int spareBonus(int frameIndex) { return _rolls[frameIndex+2]; } int sumOfRollsInFrame(int frameIndex) { return _rolls[frameIndex] + _rolls[frameIndex+1]; } public: // ... int score() { int score = 0; int frameIndex = 0; for (int frame=0; frame<10; ++frame) { if ( isStrike(frameIndex) ) { score += 10 + strikeBonus(frameIndex); frameIndex += 1; } else if ( isSpare(frameIndex) ) { score += 10 + spareBonus(frameIndex); frameIndex += 2; } else { score += sumOfRollsInFrame(frameIndex); frameIndex += 2; } } return score; }
![Page 149: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/149.jpg)
Olve Maudal Test-Driven Development January 2007
The Fourth Test // ... void testOneSpare() { BowlingGame g; g.roll(5); g.roll(5); // spare g.roll(3); rollMany(g, 17, 0); ASSERT_TRUE(g.score() == 16); } void testOneStrike() { BowlingGame g; g.roll(10); // strike g.roll(3); g.roll(4); rollMany(g, 16, 0); ASSERT_TRUE(g.score() == 24); } // ...
// ... private: bool isSpare(int frameIndex) { return _rolls[frameIndex] + _rolls[frameIndex+1] == 10; } bool isStrike(int frameIndex) { return _rolls[frameIndex] == 10; } int strikeBonus(int frameIndex) { return _rolls[frameIndex+1] + _rolls[frameIndex+2]; } int spareBonus(int frameIndex) { return _rolls[frameIndex+2]; } int sumOfRollsInFrame(int frameIndex) { return _rolls[frameIndex] + _rolls[frameIndex+1]; } public: // ... int score() { int score = 0; int frameIndex = 0; for (int frame=0; frame<10; ++frame) { if ( isStrike(frameIndex) ) { score += 10 + strikeBonus(frameIndex); frameIndex += 1; } else if ( isSpare(frameIndex) ) { score += 10 + spareBonus(frameIndex); frameIndex += 2; } else { score += sumOfRollsInFrame(frameIndex); frameIndex += 2; } } return score; }
![Page 150: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/150.jpg)
Olve Maudal Test-Driven Development January 2007
The Fifth Test
![Page 151: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/151.jpg)
Olve Maudal Test-Driven Development January 2007
The Fifth Test // ... void testOneSpare() { BowlingGame g; g.roll(5); g.roll(5); // spare g.roll(3); rollMany(g, 17, 0); ASSERT_TRUE(g.score() == 16); } void testOneStrike() { BowlingGame g; g.roll(10); // strike g.roll(3); g.roll(4); rollMany(g, 16, 0); ASSERT_TRUE(g.score() == 24); } void testPerfectGame() { BowlingGame g; rollMany(g, 12, 10); ASSERT_TRUE(g.score() == 300); } // ...
// ... int score() { int score = 0; int frameIndex = 0; for (int frame=0; frame<10; ++frame) { if ( isStrike(frameIndex) ) { score += 10 + strikeBonus(frameIndex); frameIndex += 1; } else if ( isSpare(frameIndex) ) { score += 10 + spareBonus(frameIndex); frameIndex += 2; } else { score += sumOfRollsInFrame(frameIndex); frameIndex += 2; } } return score; }
![Page 152: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/152.jpg)
Olve Maudal Test-Driven Development January 2007
The Fifth Test // ... void testOneSpare() { BowlingGame g; g.roll(5); g.roll(5); // spare g.roll(3); rollMany(g, 17, 0); ASSERT_TRUE(g.score() == 16); } void testOneStrike() { BowlingGame g; g.roll(10); // strike g.roll(3); g.roll(4); rollMany(g, 16, 0); ASSERT_TRUE(g.score() == 24); } void testPerfectGame() { BowlingGame g; rollMany(g, 12, 10); ASSERT_TRUE(g.score() == 300); } // ...
// ... int score() { int score = 0; int frameIndex = 0; for (int frame=0; frame<10; ++frame) { if ( isStrike(frameIndex) ) { score += 10 + strikeBonus(frameIndex); frameIndex += 1; } else if ( isSpare(frameIndex) ) { score += 10 + spareBonus(frameIndex); frameIndex += 2; } else { score += sumOfRollsInFrame(frameIndex); frameIndex += 2; } } return score; }
OK BowlingGameTest/testGutterGame/1 OK BowlingGameTest/testAllOnes/1 OK BowlingGameTest/testOneSpare/1 OK BowlingGameTest/testOneStrike/1 OK BowlingGameTest/testPerfectGame/1 BowlingGameTest OK (5 tests, 0 errors)
![Page 153: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/153.jpg)
Olve Maudal Test-Driven Development January 2007
The Fifth Test // ... void testOneSpare() { BowlingGame g; g.roll(5); g.roll(5); // spare g.roll(3); rollMany(g, 17, 0); ASSERT_TRUE(g.score() == 16); } void testOneStrike() { BowlingGame g; g.roll(10); // strike g.roll(3); g.roll(4); rollMany(g, 16, 0); ASSERT_TRUE(g.score() == 24); } void testPerfectGame() { BowlingGame g; rollMany(g, 12, 10); ASSERT_TRUE(g.score() == 300); } // ...
// ... int score() { int score = 0; int frameIndex = 0; for (int frame=0; frame<10; ++frame) { if ( isStrike(frameIndex) ) { score += 10 + strikeBonus(frameIndex); frameIndex += 1; } else if ( isSpare(frameIndex) ) { score += 10 + spareBonus(frameIndex); frameIndex += 2; } else { score += sumOfRollsInFrame(frameIndex); frameIndex += 2; } } return score; }
![Page 154: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/154.jpg)
Olve Maudal Test-Driven Development January 2007
Comparing TDD and OOAD
+ roll(pins : int)+ score() : int
Game
+ roll(pins : int)+ score() : int
Game
+ score() : int
Frame
Tenth Frame
- pins : int
Roll10 1..2
1
next frame
Design by TDD Design by OOAD
![Page 155: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/155.jpg)
Olve Maudal Test-Driven Development January 2007
Comparing TDD and OOAD
+ roll(pins : int)+ score() : int
Game
+ roll(pins : int)+ score() : int
Game
+ score() : int
Frame
Tenth Frame
- pins : int
Roll10 1..2
1
next frame
Design by TDD Design by OOAD
(ok, this design is not good... but it illustrates the point well)
![Page 156: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/156.jpg)
Olve Maudal Test-Driven Development January 2007
The Bowling Kata, Summary
• TDD drives the design and implementation process • Test coverage is often close to 100% • TDD vs Debuggers
![Page 157: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/157.jpg)
Olve Maudal Test-Driven Development January 2007
(blank)
![Page 158: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/158.jpg)
Olve Maudal Test-Driven Development January 2007
(overview) More TDD examples
• Brief introduction to Test-Driven Development • QUnit - A simple framework for unit testing in C++ • The Bowling Game Kata in C++ • More TDD examples • Q&A
![Page 159: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/159.jpg)
Olve Maudal Test-Driven Development January 2007
Eclipse
![Page 160: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/160.jpg)
Olve Maudal Test-Driven Development January 2007
Eclipse - New Java Project
![Page 161: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/161.jpg)
Olve Maudal Test-Driven Development January 2007
Eclipse - Add JUnit Library
![Page 162: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/162.jpg)
Olve Maudal Test-Driven Development January 2007
Eclipse - Create new JUnit Test Case
![Page 163: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/163.jpg)
Olve Maudal Test-Driven Development January 2007
Eclipse - Create new JUnit Test Case
![Page 164: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/164.jpg)
Olve Maudal Test-Driven Development January 2007
Eclipse - JUnit Test Case
![Page 165: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/165.jpg)
Olve Maudal Test-Driven Development January 2007
Eclipse - write the first test
![Page 166: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/166.jpg)
Olve Maudal Test-Driven Development January 2007
Eclipse - use class wizard to fix compile error
![Page 167: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/167.jpg)
Olve Maudal Test-Driven Development January 2007
Eclipse - a new class is created
![Page 168: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/168.jpg)
Olve Maudal Test-Driven Development January 2007
Eclipse - Run As "JUnit Test"
![Page 169: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/169.jpg)
Olve Maudal Test-Driven Development January 2007
Eclipse - First successful build
![Page 170: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/170.jpg)
Olve Maudal Test-Driven Development January 2007
Eclipse - Add a test
![Page 171: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/171.jpg)
Olve Maudal Test-Driven Development January 2007
Eclipse - Resolve compile issues
![Page 172: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/172.jpg)
Olve Maudal Test-Driven Development January 2007
Eclipse - using wizard to create the method
![Page 173: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/173.jpg)
Olve Maudal Test-Driven Development January 2007
Eclipse - using wizard to create the method
![Page 174: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/174.jpg)
Olve Maudal Test-Driven Development January 2007
Eclipse - compile ok
![Page 175: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/175.jpg)
Olve Maudal Test-Driven Development January 2007
Eclipse - test ok
![Page 176: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/176.jpg)
Olve Maudal Test-Driven Development January 2007
(blank)
![Page 177: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/177.jpg)
Olve Maudal Test-Driven Development January 2007
Behaviour-Driven Development
In computer science Behavior Driven Development (or BDD) is a programming technique that questions the behavior of an application before and during the development process. By asking questions such as "What should this application do?" or "What should this part do?" developers can identify gaps in their understanding of the problem domain and talk to their peers or domain experts to find the answers. By focusing on the behavior of applications, developers try to create a common language that's shared by all stakeholders: management, users, developers, project management and domain experts.
[source: Wikipedia]
BDD is TDD done correctly. [source: unknown]
![Page 178: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/178.jpg)
Olve Maudal Test-Driven Development January 2007
BDD - Bowling Score with RSpec (Ruby) require 'spec' context "A bowling score calculator" do setup do @game = Game.new end specify "should score 0 for an all gutter game" do (1..20).each { @game.roll(0) } @game.score.should.be 0 end specify "should score 20 for an all ones game" do (1..20).each { @game.roll(1) } @game.score.should.be 20 end specify "should score 150 for an all fives game" do (1..21).each { @game.roll(5) } @game.score.should.be 150 end specify "should score 300 for a perfect game" do (1..12).each { @game.roll(10) } @game.score.should.be 300 end end
class Game def initialize @rolls = [] end def roll(pins) @rolls.push pins end def score compute_score(1, @rolls) end def compute_score(frame, rolls) return 0 if frame > 10 return do_strike(frame, rolls) if strike?(rolls) return do_spare(frame, rolls) if spare?(rolls) return do_regular_frame(frame, rolls) end def strike?(rolls) rolls[0] == 10 end def spare?(rolls) rolls[0] + rolls[1] == 10 end def do_strike(frame, rolls) 10 + rolls[1] + rolls[2] + compute_score(frame + 1, rolls[1..-1]) end def do_spare(frame, rolls) 10 + rolls[2] + compute_score(frame + 1, rolls[2..-1]) end def do_regular_frame(frame, rolls) rolls[0] + rolls[1] + compute_score(frame + 1, rolls[2..-1]) end end
![Page 179: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/179.jpg)
Olve Maudal Test-Driven Development January 2007
(blank)
![Page 180: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/180.jpg)
Olve Maudal Test-Driven Development January 2007
(overview)
• Brief introduction to Test-Driven Development • QUnit - A simple framework for unit testing in C++ • The Bowling Game Kata in C++ • TDD in other languages • Q&A
![Page 181: Test-Driven Development - pvv.orgoma/TDDBowlingGameKata.pdf · 2011. 5. 30. · Olve Maudal Test-Driven Development January 2007 (overview) • Brief introduction to Test-Driven Development](https://reader036.vdocuments.mx/reader036/viewer/2022071016/5fce9eee40f6db3a8d7ff21e/html5/thumbnails/181.jpg)
Olve Maudal Test-Driven Development January 2007
(lastpage) Q&A
Q&A