QuickCheck is a lightweight tool for randomly testing Haskell programs. It uses type classes like Arbitrary and CoArbitrary to generate random test cases for data types and functions. Properties to check are specified using a domain specific language embedded in Haskell. Case studies show it can find errors in programs like unification and pretty printing. While lightweight, QuickCheck has limitations like difficulty testing non-terminating programs and formal specifications are still needed to fully check programs.