Five Flavors of Testing

A fundamental problem with software testing is that testing under all combinations of inputs and preconditions (initial state) is not feasible, even with a simple product. This means that the number of defects in a software product can be very large and defects that occur infrequently are difficult to find in testing. More significantly, non-functional dimensions of quality (how it is supposed to be versus what it is supposed to do) - usability, scalability, performance, compatibility, reliability - can be highly subjective; something that constitutes sufficient value to one person may be intolerable to another.
Software developers can't test everything, but they can use combinatorial test design to identify the minimum number of tests needed to get the coverage they want. Combinatorial test design enables users to get greater test coverage with fewer tests. Whether they are looking for speed or test depth, they can use combinatorial test design methods to build structured variation into their test cases. Note that "coverage", as used here, is referring to combinatorial coverage, not requirements coverage.
I advise a developer to improve testcases at developer side not only unit testing, they can cover different variaties of test cases like integration test case.

Testing different flavours

1) Unit Testing: It should examine the behavior of a distinct unit of work, Like checking methods in classes by writing test cases.
2) Integration Testing: It should examine the interaction between components in their target environment.
3) Functional Testing: It should test the application use cases. Functional testing is a type of black box testing that bases its test cases on the specifications of the software component under test, and as such, should require no knowledge of the inner design of the code or logic.
4) Stress/load Testing (Performance Testing): It should test the performance of the application. Without performance testing, software is likely to suffer from issues such as: running slow while several users use it simultaneously, inconsistencies across different operating systems and poor usability. Performance testing will determine whether or not their software meets speed, scalability and stability requirements under expected workloadsy.
5) Acceptance Testing: It should ensure that the application has met the customer's goal.

Unit testing five flavours

Innermost software tests are related to code progress, outermost tests are more functional.
UnitTesting and Integration testing are handled by the developer. Remaining are will take care by the tester.
There are many approaches available in software testing. Reviews, walkthroughs, or inspections are referred to as static testing, whereas actually executing programmed code with a given set of test cases is referred to as dynamic testing. Static testing is often implicit, as proofreading, plus when programming tools/text editors check source code structure or compilers (pre-compilers) check syntax and data flow as static program analysis. Dynamic testing takes place when the program itself is run. Dynamic testing may begin before the program is 100% complete in order to test particular sections of code and are applied to discrete functions or modules. Typical techniques for this are either using stubs/drivers or execution from a debugger environment.
Static testing involves verification, whereas dynamic testing involves validation. Together they help improve software quality. Among the techniques for static analysis, mutation testing can be used to ensure the test-cases will detect errors which are introduced by mutating the source code.