Exploratory testing is an approach to software assessment that integrates learning about the program that's being developed with plans for future testing. Exploratory testing is sometimes referred to as ad hoc testing.
Once coding is complete, exploratory testing helps developers learn more about a program's functionality and discover whether requirements have been missed or misunderstood. Missed requirements may turn into new user stories, or they may be bugs that need to be fixed right away.
Testers manage the scope of exploratory testing by using a concept called charters. Charters are statements of what aspects of the system are to be tested. Unlike scripts, exploratory testing charters leave the actual steps of the testing up to the skilled and disciplined tester. For example, while a script might say "Type John Smith into the User field and 1234 into the Password field," a charter might simply say "test the login functionality."
Designing charters for exploratory testing is one of the most difficult aspects of exploratory testing. It is hard to know how much testing is enough, what aspects of the system need more coverage or how long a tester should spend examining any particular aspect of the system.