SlideShare a Scribd company logo
Program
with GUTs
Kevlin Henney
@KevlinHenney
@kevlin@mastodon.social
@kevlin.bsky.social
threads.net/@kevlin.henney
instagram.com/kevlin.henney
about.me/kevlin
linkedin.com/in/kevlin
kevlinhenney.medium.com
kevlin@curbralan.com
slideshare.net/Kevlin
Program with GUTs
So you’re writing unit tests?
Great!
Are they any good?
Kevlin Henney
“Program with GUTs”
medium.com/97-things/program-with-guts-828e69dd8e15
Do you have GUTs?
Kevlin Henney
“Program with GUTs”
medium.com/97-things/program-with-guts-828e69dd8e15
Very many people say “TDD”
when they really mean,
“I have good unit tests”
(“I have GUTs”?)
Alistair Cockburn
“The modern programming professional has GUTs”
(“I have GUTs
Or have you landed someone
(future you?) with interest-
accumulating technical debt
in their testbase?
Kevlin Henney
“Program with GUTs”
medium.com/97-things/program-with-guts-828e69dd8e15
What do I mean by good?
Kevlin Henney
“Program with GUTs”
medium.com/97-things/program-with-guts-828e69dd8e15
We think in generalities,
but we live in detail.
Alfred North Whitehead
mastodon.social/deck/@0xabad1dea@infosec.exchange/112015426639751687
Program with GUTs
public static bool IsLeapYear(int year) 
[Test]
public void Test() 
[Test]
public void TestIsLeapYear() 
[Test]
public void TestIsLeapYearIsOK() 
[Test]
public void TestIsLeapYearIsCorrect() 
[Test]
public void TestIsLeapYearWorks() 
[Test]
public void TestIsLeapYearWorksAsExpected() 
[Test]
public void Test1() 
[Test]
public void Test2() 
[Test]
public void TestLeapYears() 
[Test]
public void TestNonLeapYears() 
[Test]
public void TestLeapYears()
{
Assert.IsTrue(IsLeapYear(2024));
Assert.IsTrue(IsLeapYear(2000));
}
[Test]
public void TestNonLeapYears() 
[Test]
public void Test2024IsALeapYear() 
[Test]
public void Test2000IsALeapYear() 
[Test]
public void Test2023IsNotALeapYear() 
[Test]
public void Test1900IsNotALeapYear() 
[Test]
public void Test2016IsALeapYear() 
[Test]
public void Test2400IsALeapYear() 
[Test]
public void Test2022IsNotALeapYear() 
[Test]
public void Test2100IsNotALeapYear() 
Program with GUTs
Write Tests
for People
Gerard Meszaros
97-things-every-x-should-know.gitbooks.io/97-things-every-programmer-should-know/content/en/thing_95
Gerard Meszaros
97-things-every-x-should-know.gitbooks.io/97-things-every-programmer-should-know/content/en/thing_95
So who should you be
writing the tests for?
For the person trying to
understand your code.
Gerard Meszaros
97-things-every-x-should-know.gitbooks.io/97-things-every-programmer-should-know/content/en/thing_95
Good tests act as
documentation for the
code they are testing.
A year divisible by 4 is a leap year
A year divisible by 400 is a leap year
A year not divisible by 4 is not a leap year
A year divisible by 100 is not a leap year
[Test] public void
A_year_divisible_by_4_is_a_leap_year() 
[Test] public void
A_year_divisible_by_400_is_a_leap_year() 
[Test] public void
A_year_not_divisible_by_4_is_not_a_leap_year() 
[Test] public void
A_year_divisible_by_100_is_not_a_leap_year() 
A_year_divisible_by_4_is_a_leap_year
A_year_divisible_by_400_is_a_leap_year
A_year_not_divisible_by_4_is_not_a_leap_year
A_year_divisible_by_100_is_not_a_leap_year
A_year_not_divisible_by_4_is_not_a_leap_year
A_year_divisible_by_4_is_a_leap_year
A_year_divisible_by_100_is_not_a_leap_year
A_year_divisible_by_400_is_a_leap_year
A_year_not_divisible_by_4_is_not_a_leap_year
A_year_divisible_by_4_but_not_by_100_is_a_leap_ye
A_year_divisible_by_100_but_not_by_400_is_not_a_l
A_year_divisible_by_400_is_a_leap_year
A_year_not_divisible_by_4_is_not_a_leap_year
A_year_divisible_by_4_but_not_by_100_is_a_leap_year
A_year_divisible_by_100_but_not_by_400_is_not_a_leap_year
A_year_divisible_by_400_is_a_leap_year
Not leap years
Leap years
Not leap years
Leap years
Not divisible by 4 Divisible by 4 Divisible by 100 Divisible by 400
IsLeapYear_YearNotDivisibleBy4_ReturnsFalse
IsLeapYear_YearDivisibleBy4ButNotBy100_ReturnsTrue
IsLeapYear_YearDivisibleBy100ButNotBy400_ReturnsFalse
IsLeapYear_YearDivisibleBy400_ReturnsTrue
A_year_not_divisible_by_4_should_not_be_a_leap_year
A_year_divisible_by_4_but_not_by_100_should_not_be_a_leap_y
A_year_divisible_by_100_but_not_by_400_should_not_be_a_leap
A_year_divisible_by_400_should_not_be_a_leap_year
A_year_not_divisible_by_4_must_not_be_a_leap_year
A_year_divisible_by_4_but_not_by_100_must_not_be_a_leap_yea
A_year_divisible_by_100_but_not_by_400_must_not_be_a_leap_y
A_year_divisible_by_400_must_not_be_a_leap_year
A_year_not_divisible_by_4_is_not_a_leap_year
A_year_divisible_by_4_but_not_by_100_is_a_leap_year
A_year_divisible_by_100_but_not_by_400_is_not_a_leap_year
A_year_divisible_by_400_is_a_leap_year
Program with GUTs
Propositions
are vehicles
for stating
how things are
or might be.
Thus only indicative
sentences which it
makes sense to think
of as being true or as
being false are
capable of expressing
propositions.
public static bool IsLeapYear(int year)
{
return year % 4 == 0 &&
year % 100 != 0 ||
year % 400 == 0;
}
A_year_not_divisible_by_4_is_not_a_leap_year
A_year_divisible_by_4_but_not_by_100_is_a_leap_year
A_year_divisible_by_100_but_not_by_400_is_not_a_leap_year
A_year_divisible_by_400_is_a_leap_year
public static bool IsLeapYear(int year)
{
return year % 4 == 0;
}
A_year_not_divisible_by_4_is_not_a_leap_year
A_year_divisible_by_4_but_not_by_100_is_a_leap_year
A_year_divisible_by_100_but_not_by_400_is_not_a_leap_year
A_year_divisible_by_400_is_a_leap_year
A failing test should tell you exactly what is
wrong quickly, without you having to spend a lot
of time analyzing the failure.
This means...
Marit van Dijk
“Use Testing to Develop Better Software Faster”
medium.com/97-things/use-testing-to-develop-better-software-faster-9dd2616543d3
Each test should test one thing.
Marit van Dijk
“Use Testing to Develop Better Software Faster”
medium.com/97-things/use-testing-to-develop-better-software-faster-9dd2616543d3
Use meaningful, descriptive names.
Don’t just describe what the test does either (we
can read the code), tell us why it does this. This
can help decide whether a test should be
updated in line with changed functionality or
whether an actual failure that should be fixed
has been found.
Marit van Dijk
“Use Testing to Develop Better Software Faster”
medium.com/97-things/use-testing-to-develop-better-software-faster-9dd2616543d3
Never trust a test you haven’t seen fail.
Marit van Dijk
“Use Testing to Develop Better Software Faster”
medium.com/97-things/use-testing-to-develop-better-software-faster-9dd2616543d3
public class Leap_year_spec
{
public class A_year_is_a_leap_year
{
[Test]
public void if_it_is_divisible_by_4_but_not_by_100() 
[Test]
public void if_it_is_divisible_by_400() 
}
public class A_year_is_not_a_leap_year
{
[Test]
public void if_it_is_not_divisible_by_4() 
[Test]
public void if_it_is_divisible_by_100_but_not_by_400() 
}
}
namespace Leap_year_spec
{
public class A_year_is_a_leap_year
{
[Test]
public void if_it_is_divisible_by_4_but_not_by_100() 
[Test]
public void if_it_is_divisible_by_400() 
}
public class A_year_is_not_a_leap_year
{
[Test]
public void if_it_is_not_divisible_by_4() 
[Test]
public void if_it_is_divisible_by_100_but_not_by_400() 
}
}
namespace Leap_year_spec
{
public class A_year_is_a_leap_year
{
[Test]
public void if_it_is_divisible_by_4_but_not_by_100() 
[Test]
public void if_it_is_divisible_by_400() 
}
public class A_year_is_not_a_leap_year
{
[Test]
public void if_it_is_not_divisible_by_4() 
[Test]
public void if_it_is_divisible_by_100_but_not_by_400() 
}
}
Nat Pryce & Steve Freeman
Are your tests really driving your development?
For tests to drive development they must do
more than just test that code performs its
required functionality: they must clearly express
that required functionality to the reader.
That is, they must be clear specifications of the
required functionality.
namespace Leap_year_spec
{
public class A_year_is_a_leap_year 
public class A_year_is_not_a_leap_year 
}
namespace Leap_year_spec
{
public class A_year_is_a_leap_year 
public class A_year_is_not_a_leap_year
{
[Test]
public void if_it_is_not_divisible_by_4()
{
Assert.IsFalse(IsLeapYear(2023));
}
[Test]
public void if_it_is_divisible_by_100_but_not_by_400() 
}
}
namespace Leap_year_spec
{
public class A_year_is_a_leap_year 
public class A_year_is_not_a_leap_year
{
[Test]
public void if_it_is_not_divisible_by_4()
{
Assert.IsFalse(IsLeapYear(2023));
Assert.IsFalse(IsLeapYear(2022));
Assert.IsFalse(IsLeapYear(1999));
Assert.IsFalse(IsLeapYear(3));
}
[Test]
public void if_it_is_divisible_by_100_but_not_by_400() 
}
}
namespace Leap_year_spec
{
public class A_year_is_a_leap_year 
public class A_year_is_not_a_leap_year
{
[TestCase(2023)]
[TestCase(2022)]
[TestCase(1999)]
[TestCase(3)]
public void if_it_is_not_divisible_by_4(int year)
{
Assert.IsFalse(IsLeapYear(year));
}
[Test]
public void if_it_is_divisible_by_100_but_not_by_400() 
}
}
namespace Leap_year_spec
{
public class A_year_is_a_leap_year 
public class A_year_is_not_a_leap_year
{
[Test]
public void if_it_is_not_divisible_by_4(
[Values(2023, 2022, 1999, 3)] int year)
{
Assert.IsFalse(IsLeapYear(year));
}
[Test]
public void if_it_is_divisible_by_100_but_not_by_400() 
}
}
namespace Leap_year_spec
{
public class A_year_is_a_leap_year
{
[Test]
public void if_it_is_divisible_by_4_but_not_by_100(
[Values(2024, 2016, 1984, 4) int year) 
[Test]
public void if_it_is_divisible_by_400(
[Range(400, 4000, 400)] int year) 
}
public class A_year_is_not_a_leap_year
{
[Test]
public void if_it_is_not_divisible_by_4(
[Values(2023, 2022, 1999, 3)] int year) 
[Test]
public void if_it_is_divisible_by_100_but_not_by_400(
[Values(2100, 1900, 1800, 100)] int year) 
}
}
Simple
cases
Common
cases
Error
cases
Boundary
cases
Simple
cases
Common
cases
Error
cases
Boundary
cases ?
namespace Leap_year_spec
{
public class A_year_is_a_leap_year 
public class A_year_is_not_a_leap_year 
public class Error_cases 
}
namespace Leap_year_spec
{
public class A_year_is_a_leap_year 
public class A_year_is_not_a_leap_year 
public class A_year_is_not_supported 
}
namespace Leap_year_spec
{
public class A_year_is_a_leap_year 
public class A_year_is_not_a_leap_year 
public class A_year_is_not_supported
{
[Test]
public void if_it_is_0()
{
Assert.Throws<ArgumentOutOfRangeException>(() => IsLeapYear(0));
}
}
}
namespace Leap_year_spec
{
public class A_year_is_a_leap_year 
public class A_year_is_not_a_leap_year 
public class A_year_is_not_supported
{
[Test]
public void if_it_is_0()
{
Assert.Catch<ArgumentOutOfRangeException>(() => IsLeapYear(0));
}
}
}
namespace Leap_year_spec
{
public class A_year_is_a_leap_year 
public class A_year_is_not_a_leap_year 
public class A_year_is_not_supported
{
[Test]
public void if_it_is_0()
{
Assert.Catch<ArgumentOutOfRangeException>(() => IsLeapYear(0));
}
[Test]
public void if_it_is_negative(
[Values(-1, -4, -100, -400)] int year)
{
Assert.Catch<ArgumentOutOfRangeException>(() => IsLeapYear(year));
}
}
}
namespace Leap_year_spec
{
public class A_year_is_a_leap_year 
public class A_year_is_not_a_leap_year 
public class A_year_is_not_supported
{
[Test]
public void if_it_is_0()
{
Assert.Catch<ArgumentOutOfRangeException>(() => IsLeapYear(0));
}
[Test]
public void if_it_is_negative(
[Values(-1, -4, -100, -400, int.MinValue)] int year)
{
Assert.Catch<ArgumentOutOfRangeException>(() => IsLeapYear(year));
}
}
}
namespace Leap_year_spec
{
public class A_year_is_a_leap_year 
public class A_year_is_not_a_leap_year 
public class A_year_is_supported 
public class A_year_is_not_supported 
}
namespace Leap_year_spec
{
public class A_year_is_a_leap_year 
public class A_year_is_not_a_leap_year 
public class A_year_is_supported
{
[Test]
public void if_it_is_positive(
[Values(1, 10000, int.MaxValue)] int year)
{
Assert.DoesNotThrow(() => IsLeapYear(year));
}
}
public class A_year_is_not_supported 
}
Leo Tolstoy
Anna Karenina
All happy families are alike;
each unhappy family is
unhappy in its own way.
namespace Leap_year_spec 
public class A_year_is_a_leap_year 
public void if_it_is_divisible_by_4_but_not_by_400() 
public void if_it_is_divisible_by_400() 
public class A_year_is_not_a_leap_year 
public void if_is_not_divisible_by_4() 
public void if_it_is_divisible_by_100_but_not_by_400() 
public class A_year_is_supported 
public void if_it_is_positive() 
public class A_year_is_not_supported 
public void if_it_is_0() 
public void if_it_is_negative() 
namespace Leap_year_spec 
public class A_year_is_a_leap_year 
public void if_it_is_divisible_by_4_but_not_by_400() 
public void if_it_is_divisible_by_400() 
public class A_year_is_not_a_leap_year 
public void if_is_not_divisible_by_4() 
public void if_it_is_divisible_by_100_but_not_by_400() 
public class A_year_is_supported 
public void if_it_is_positive() 
public class A_year_is_not_supported 
public void if_it_is_0() 
public void if_it_is_negative() 
Program with GUTs
Producer Consumer
Queue
Length
Capacity
Enqueue ⮞ ⮜ Dequeue
public class Queue<T>
{
...
public Queue(int capacity) ...
public int Capacity => ...
public int Length => ...
public bool Enqueue(T toBack) ...
public bool Dequeue(out T fromFront) ...
}
Nat Pryce & Steve Freeman
Are your tests really driving your development?
Tests that are not written with their role as
specifications in mind can be very confusing to
read. The difficulty in understanding what they
are testing can greatly reduce the velocity at
which a codebase can be changed.
public class QueueTests
{
[Test]
public void TestConstructor() ...
[Test]
public void TestCapacity() ...
[Test]
public void TestLength() ...
[Test]
public void TestEnqueue() ...
[Test]
public void TestDequeue() ...
}
public class QueueTests
{
[Test]
public void Constructor() ...
[Test]
public void Capacity() ...
[Test]
public void Length() ...
[Test]
public void Enqueue() ...
[Test]
public void Dequeue() ...
}
public class QueueTests
{
[Test]
public void CanBeConstructed() ...
[Test]
public void HasCapacity() ...
[Test]
public void HasLength() ...
[Test]
public void CanBeEnqueuedOn() ...
[Test]
public void CanBeDequeuedFrom() ...
}
public class QueueTests
{
[Test]
public void CanSometimesBeConstructed() ...
[Test]
public void HasCapacity() ...
[Test]
public void HasLength() ...
[Test]
public void CanSometimesBeEnqueuedOn() ...
[Test]
public void CanSometimesBeDequeuedFrom() ...
}
85
twitter.com/venkat_s/status/1633131055635890179
namespace Queue_spec 
public class Creating_a_queue 
public void leaves_it_empty() 
public void preserves_positive_bounding_capacity() 
public void fails_with_non_positive_bounding_capacity() 
public class Enqueuing_on 
public void an_empty_queue_makes_it_longer() 
public void a_non_empty_queue_makes_it_longer() 
public void a_non_full_queue_up_to_capacity_makes_it_full() 
public void a_full_queue_is_ignored() 
public class Dequeuing_from 
public void an_empty_queue_is_ignored_with_default_value() 
public void a_non_empty_queue_gives_values_in_order_enqueued() 
public void a_full_queue_makes_it_non_full() 
namespace Queue_spec 
public class Creating_a_queue 
public void leaves_it_empty() 
public void preserves_positive_bounding_capacity() 
public void fails_with_non_positive_bounding_capacity() 
public class Enqueuing_on 
public void an_empty_queue_makes_it_longer() 
public void a_non_empty_queue_makes_it_longer() 
public void a_non_full_queue_up_to_capacity_makes_it_full() 
public void a_full_queue_is_ignored() 
public class Dequeuing_from 
public void an_empty_queue_is_ignored_with_default_value() 
public void a_non_empty_queue_gives_values_in_order_enqueued() 
public void a_full_queue_makes_it_non_full() 
public class Enqueuing_on 
public void an_empty_queue_makes_it_longer(string value)
{
var queue = new Queue<string>(2);
var enqueued = queue.Enqueue(value);
Assert.IsTrue(enqueued);
Assert.AreEqual(1, queue.Length);
}
public class Enqueuing_on 
public void an_empty_queue_makes_it_longer(string value)
{
var queue = new Queue<string>(2);
var enqueued = queue.Enqueue(value);
Assert.IsTrue(enqueued);
Assert.AreEqual(1, queue.Length);
}
Gerard Meszaros
97-things-every-x-should-know.gitbooks.io/97-things-every-programmer-should-know/content/en/thing_95
For each usage scenario, the test(s):
▪ Describe the context, starting point, or
preconditions that must be satisfied
▪ Illustrate how the software is invoked
▪ Describe the expected results or
postconditions to be verified
public class Enqueuing_on 
public void an_empty_queue_makes_it_longer(string value)
{
// Arrange:
var queue = new Queue<string>(2);
// Act:
var enqueued = queue.Enqueue(value);
// Assert:
Assert.IsTrue(enqueued);
Assert.AreEqual(1, queue.Length);
}
public class Enqueuing_on 
public void an_empty_queue_makes_it_longer(string value)
{
// Establish precondition for operation:
var queue = new Queue<string>(2);
// Perform operation of interest:
var enqueued = queue.Enqueue(value);
// Confirm postcondition of operation:
Assert.IsTrue(enqueued);
Assert.AreEqual(1, queue.Length);
}
public class Enqueuing_on 
public void an_empty_queue_makes_it_longer(string value)
{
// Given:
var queue = new Queue<string>(2);
// When:
var enqueued = queue.Enqueue(value);
// Then:
Assert.IsTrue(enqueued);
Assert.AreEqual(1, queue.Length);
}
Thinking in States
In most real-world situations, people’s
relaxed attitude to state is not an issue.
Unfortunately, however, many
programmers are quite vague about
state too — and that is a problem.
Niclas Nilsson
97-things-every-x-should-know.gitbooks.io/97-things-every-programmer-should-know/content/en/thing_84
Non-Empty
Empty
Dequeue Enqueue
Dequeue [Length > 1]
Enqueue
Dequeue [Length == 1]
new [Capacity > 0]
Non-Full
Empty
Dequeue
Enqueue
Dequeue [Length > 1]
Enqueue
Dequeue [Length == 1]
new [Capacity > 0]
Full
Non-Empty
[Length = Capacity]
[Length < Capacity]
namespace Queue_spec 
public class A_new_queue 
public void is_empty() 
public void preserves_positive_bounding_capacity() 
public void fails_with_non_positive_bounding_capacity() 
public class An_empty_queue 
public void ignores_dequeuing_with_default_value() 
public void becomes_non_empty_when_value_enqueued() 
public class A_non_empty_queue 
public class that_is_not_full 
public void becomes_longer_when_value_enqueued() 
public void becomes_full_when_enqueued_up_to_capacity() 
public class that_is_full 
public void ignores_further_enqueued_values() 
public void becomes_non_full_when_dequeued() 
public void dequeues_values_in_order_enqueued() 
namespace Queue_spec 
public class A_new_queue 
public void is_empty() 
public void preserves_positive_bounding_capacity() 
public void fails_with_non_positive_bounding_capacity() 
public class An_empty_queue 
public void ignores_dequeuing_with_default_value() 
public void becomes_non_empty_when_value_enqueued() 
public class A_non_empty_queue 
public class that_is_not_full 
public void becomes_longer_when_value_enqueued() 
public void becomes_full_when_enqueued_up_to_capacity() 
public class that_is_full 
public void ignores_further_enqueued_values() 
public void becomes_non_full_when_dequeued() 
public void dequeues_values_in_order_enqueued() 
Given
When
Then
Given can be used to group
tests for operations with
respect to common
initial state
When can be used to group
tests by operation,
differentiated by initial
state or outcome
Then can be used to group
tests by common
outcome, regardless of
initial state
I hope that’s been useful.
You’re off to do revisit some
tests?
OK, catch you later.
Kevlin Henney
“Program with GUTs”
medium.com/97-things/program-with-guts-828e69dd8e15

More Related Content

PDF
Solid Deconstruction
PDF
AI_Unit I notes .pdf
PPTX
Job sequencing with deadline
PDF
First order logic
PPTX
AI_Session 28 planning graph.pptx
PPTX
AI: AI & Searching
PPTX
Lecture 06 production system
PPTX
Component object model and
Solid Deconstruction
AI_Unit I notes .pdf
Job sequencing with deadline
First order logic
AI_Session 28 planning graph.pptx
AI: AI & Searching
Lecture 06 production system
Component object model and

What's hot (20)

PPTX
Internet of Things, TYBSC IT, Semester 5, Unit II
PPTX
AI_1 Introduction of AI
PDF
penetration test using Kali linux seminar report
PPTX
Artificial intelligence ppt
PPTX
Greedy algorithms
PDF
Artificial Intelligence in Gaming
PDF
Intro Artificial Intelligence
PDF
Ai 02 intelligent_agents(1)
PPTX
AI_Session 11: searching with Non-Deterministic Actions and partial observati...
PPTX
AI: Learning in AI
PPT
First order logic
PPT
Knapsack problem
PPTX
Intelligent agent
PPTX
What Is The Difference Between Weak (Narrow) And Strong (General) Artificial ...
PPT
Expert system 21 sldes
PPTX
1. Internet of Things - M2M to IoT
PPT
Expert System Full Details
PPTX
Artificial intelligent
PPTX
Artificial Intelligence Notes Unit 3
PPTX
Quantum machine learning basics
Internet of Things, TYBSC IT, Semester 5, Unit II
AI_1 Introduction of AI
penetration test using Kali linux seminar report
Artificial intelligence ppt
Greedy algorithms
Artificial Intelligence in Gaming
Intro Artificial Intelligence
Ai 02 intelligent_agents(1)
AI_Session 11: searching with Non-Deterministic Actions and partial observati...
AI: Learning in AI
First order logic
Knapsack problem
Intelligent agent
What Is The Difference Between Weak (Narrow) And Strong (General) Artificial ...
Expert system 21 sldes
1. Internet of Things - M2M to IoT
Expert System Full Details
Artificial intelligent
Artificial Intelligence Notes Unit 3
Quantum machine learning basics
Ad

Similar to Program with GUTs (20)

PDF
Structure and Interpretation of Test Cases
PDF
"How keep normal blood pressure using TDD" By Roman Loparev
PPTX
oo testing.pptx
PDF
Junit Recipes - Elementary tests (2/2)
PPTX
Pro Java Fx – Developing Enterprise Applications
DOCX
Exercise 1 [10 points]Write a static method named num
DOCX
Exercise 1 [10 points]Write a static method named numUniq.docx
PDF
Shift-Left Testing: QA in a DevOps World by David Laulusa
PDF
Junit Recipes - Elementary tests (1/2)
PPTX
Unit testing
PDF
Take Pride in Your Code - Test-Driven Development
PDF
Clean code
PDF
Programming with GUTs
DOCX
Junit With Eclipse
PDF
unit_tests_tutorial
PDF
Programming with GUTs
PPTX
Navigating the xDD Alphabet Soup
DOCX
Exercise1[5points]Create the following classe
PDF
Software Craftmanship - Cours Polytech
PDF
Programming with GUTs
Structure and Interpretation of Test Cases
"How keep normal blood pressure using TDD" By Roman Loparev
oo testing.pptx
Junit Recipes - Elementary tests (2/2)
Pro Java Fx – Developing Enterprise Applications
Exercise 1 [10 points]Write a static method named num
Exercise 1 [10 points]Write a static method named numUniq.docx
Shift-Left Testing: QA in a DevOps World by David Laulusa
Junit Recipes - Elementary tests (1/2)
Unit testing
Take Pride in Your Code - Test-Driven Development
Clean code
Programming with GUTs
Junit With Eclipse
unit_tests_tutorial
Programming with GUTs
Navigating the xDD Alphabet Soup
Exercise1[5points]Create the following classe
Software Craftmanship - Cours Polytech
Programming with GUTs
Ad

More from Kevlin Henney (20)

PDF
The Case for Technical Excellence
PDF
Empirical Development
PDF
Lambda? You Keep Using that Letter
PDF
Lambda? You Keep Using that Letter
PDF
Get Kata
PDF
Procedural Programming: It’s Back? It Never Went Away
PDF
Agility ≠ Speed
PDF
Refactoring to Immutability
PDF
Old Is the New New
PDF
Turning Development Outside-In
PDF
Giving Code a Good Name
PDF
Clean Coders Hate What Happens To Your Code When You Use These Enterprise Pro...
PDF
Thinking Outside the Synchronisation Quadrant
PDF
Code as Risk
PDF
Software Is Details
PDF
Game of Sprints
PDF
Good Code
PDF
The Error of Our Ways
PDF
Seven Ineffective Coding Habits of Many Programmers
PDF
SOLID Deconstruction
The Case for Technical Excellence
Empirical Development
Lambda? You Keep Using that Letter
Lambda? You Keep Using that Letter
Get Kata
Procedural Programming: It’s Back? It Never Went Away
Agility ≠ Speed
Refactoring to Immutability
Old Is the New New
Turning Development Outside-In
Giving Code a Good Name
Clean Coders Hate What Happens To Your Code When You Use These Enterprise Pro...
Thinking Outside the Synchronisation Quadrant
Code as Risk
Software Is Details
Game of Sprints
Good Code
The Error of Our Ways
Seven Ineffective Coding Habits of Many Programmers
SOLID Deconstruction

Recently uploaded (20)

PPTX
Agentic AI Use Case- Contract Lifecycle Management (CLM).pptx
PDF
Raksha Bandhan Grocery Pricing Trends in India 2025.pdf
PDF
medical staffing services at VALiNTRY
PDF
Adobe Illustrator 28.6 Crack My Vision of Vector Design
PDF
Which alternative to Crystal Reports is best for small or large businesses.pdf
PPTX
Lecture 3: Operating Systems Introduction to Computer Hardware Systems
PDF
How to Choose the Right IT Partner for Your Business in Malaysia
PDF
System and Network Administration Chapter 2
PDF
T3DD25 TYPO3 Content Blocks - Deep Dive by André Kraus
PDF
How to Migrate SBCGlobal Email to Yahoo Easily
PDF
Design an Analysis of Algorithms II-SECS-1021-03
PPTX
Agentic AI : A Practical Guide. Undersating, Implementing and Scaling Autono...
PPTX
Odoo POS Development Services by CandidRoot Solutions
PPTX
VVF-Customer-Presentation2025-Ver1.9.pptx
PDF
Internet Downloader Manager (IDM) Crack 6.42 Build 41
PDF
2025 Textile ERP Trends: SAP, Odoo & Oracle
PDF
How Creative Agencies Leverage Project Management Software.pdf
PDF
Digital Strategies for Manufacturing Companies
PPTX
Essential Infomation Tech presentation.pptx
PDF
Why TechBuilder is the Future of Pickup and Delivery App Development (1).pdf
Agentic AI Use Case- Contract Lifecycle Management (CLM).pptx
Raksha Bandhan Grocery Pricing Trends in India 2025.pdf
medical staffing services at VALiNTRY
Adobe Illustrator 28.6 Crack My Vision of Vector Design
Which alternative to Crystal Reports is best for small or large businesses.pdf
Lecture 3: Operating Systems Introduction to Computer Hardware Systems
How to Choose the Right IT Partner for Your Business in Malaysia
System and Network Administration Chapter 2
T3DD25 TYPO3 Content Blocks - Deep Dive by André Kraus
How to Migrate SBCGlobal Email to Yahoo Easily
Design an Analysis of Algorithms II-SECS-1021-03
Agentic AI : A Practical Guide. Undersating, Implementing and Scaling Autono...
Odoo POS Development Services by CandidRoot Solutions
VVF-Customer-Presentation2025-Ver1.9.pptx
Internet Downloader Manager (IDM) Crack 6.42 Build 41
2025 Textile ERP Trends: SAP, Odoo & Oracle
How Creative Agencies Leverage Project Management Software.pdf
Digital Strategies for Manufacturing Companies
Essential Infomation Tech presentation.pptx
Why TechBuilder is the Future of Pickup and Delivery App Development (1).pdf

Program with GUTs