Here are the key differences between Property Based Testing, Model Based Testing and Fuzzing:

1. Approach: Property based testing verifies a set of characteristics about the code, model based testing compares expected behavior with actual results, and fuzzing feeds invalid or unexpected data to test for bugs.
2. Input: Property based testing generates random inputs based on the properties defined by the programmer, model based testing and fuzzing use predetermined inputs.
3. Output: Property based testing ensures the output meets certain properties, model based testing compares the actual output with the expected output, and fuzzing seeks to induce a crash or malfunction.
4. Automation: Property based testing can be highly automated, model based testing requires more manual effort to define the system under test, and fuzzing can be highly automated with tools such as AFL or libFuzzer.
5. Scope: Property based testing and model based testing are focused on specific properties or expected behaviors, while fuzzing is more broad in scope and is designed to discover unknown bugs or vulnerabilities.
6. Target: Property based testing and model based testing can be used on any type of software, while fuzzing is often used for security testing and vulnerability discovery.
spam fails_task lang_mismatch pii not_appropriate hate_speech sexual_content quality toxicity humor helpfulness creativity violence