Anyone who works with software development in some form should read this book. Not only does it explain what and how to test but why we shouldn't try to test everything with UI or unit tests.
The book starts with an introduction of the testing pyramid and it's levels: UI, integration and unit tests. The rest of part one goes on to break these levels down, explaining how to test at each level and the advantages and disadvantages of doing so. These explanations are interspersed with explanations of web technologies and the web in general which is great if you are unfamiliar with these things and are easy to skip if you are familiar with them. Part one ends with a great section on how to apply the test pyramid, the commonly seen inverse pyramid and how to deal with flakey tests.
Part two goes into more detail starting with a brief introduction to development for those readers without a background in development. This is followed by a chapter on how to organise your tests which is more important than you'd think (ever had to find the test that proves that X works when there's a large suite of tests?). The next chapter, called Effective Mocking, is my personal favourite and not only explains mocking but how it relates to coupling in your tests and how best to manage that coupling. The book finishes up with a chapter on writing tests first and the test-code-refactor cycle of TDD.
As I said at the start of the review this book is not just aimed at developers but instead carefully balances the concerns of both developers and testers. This not only broadens the books appeal but gives some insight into how "the other side" thinks about the topics covered.