1. What?
    1. Opposite of Positive Testing
      1. Challenges pre-conditions
      2. Challenges usage modes
      3. Adds Constraints & Limitations
    2. In Short
      1. Here, you don't fulfil at least one condition the software needs in order to work at all.
    3. Examples
      1. Not giving enough memory Ex: Operating in a low memory (RAM or HDD Space) environment.
      2. Not giving valid inputs. Ex: Entering an invalid IP Address in IP Address field.
      3. Not doing the correct connections. Ex: Incorrect connection to IO Pins
      4. Blocking certain parts of the system. Ex: Disabling JS in Browser
    4. What it is NOT?
      1. Positive Testing
      2. Edge Case Testing
      3. Corner Case Testing
      4. Unusual Operation Testing
    5. Important for providing good test coverage for any feature or functionality.
  2. What's Different Compared to Positive Testing?
    1. Positive Testing
      1. Positive testing means to test while AFFIRMING every required condition.
    2. Negative Testing
      1. Negative testing means to NEGATE at least ONE required condition.
    3. Is usually NOT based on:
      1. Documented Requirements
      2. Required conditions
    4. Focuses on:
      1. Undocumented requirements
      2. Discovering unknown Information
      3. Ensuring graceful failures or exits
      4. Risks from the app's outer eco-system
      5. Challenging the boundaries and limits
      6. Unexpected usage patterns & Error Proofing
      7. Safeguarding app from potential attacks
        1. Ex:
          1. SQL Injections
          2. XSS Attacks
          3. JS Script Attacks, etc.
    5. Compliments positive testing in increasing coverage.
  3. Key Activities for Systematic Negative Testing
    1. Preparation
      1. Identify Product Constraints
      2. Research about Failures
        1. Social Media
        2. Create Alerts
        3. Community Forums
        4. #Software #Failures
      3. Refer to Requirements
        1. Find Boundaries
          1. Valid
          2. Outside
        2. Find Class Partitions
          1. Valid
          2. Invalid
    2. Consider Negative Personas
      1. Hackers
      2. Attackers
      3. Script Kiddies
      4. Unintentional Mistake
    3. Work towards Constraints & Conditions
      1. Identify them
      2. Reverse them
        1. One at a time
        2. Multiple at a time
      3. Remove them
        1. One at a time
        2. Multiple at a time
    4. Verify Error Handling & Check for
      1. Error Control
      2. Error Protection | Prevention
      3. Meaningful Messages
      4. Error Correction | Guidance
      5. Error Recovery
      6. System Recovery
  4. Tools & Resources
    1. Browser Extensions
      1. Counterstring
      2. Bug Magnet
    2. Good Resources
      1. GitHub - minimaxir/big-list-of-naughty-strings: The Big List of Naughty Strings is a list of strings which have a high probability of causing issues when used as user-input data.
      2. Common Software Errors – Checklist - Testing Titbits | Rahul Parwal
      3. Software Bug Stories