Custom Rules

Create and manage custom testing rules for your projects

Rule Types

Test Generation Rules

  • Coverage requirements
  • Test patterns
  • Assertion types
  • Mock strategies

Code Analysis Rules

  • Complexity limits
  • Style guidelines
  • Security checks
  • Performance rules

Validation Rules

  • Input validation
  • Output formats
  • Error handling
  • State management

Creating Rules

Rule Definition

// custom-rules.js
module.exports = {
  rules: {
    'require-try-catch': {
      create: (context) => ({
        CallExpression: (node) => {
          if (isAsyncCall(node) && !isInTryCatch(node)) {
            context.report({
              node,
              message: 'Async calls must be in try-catch blocks'
            });
          }
        }
      })
    },
    'test-naming-convention': {
      create: (context) => ({
        describe: (node) => {
          if (!followsNamingPattern(node.name)) {
            context.report({
              node,
              message: 'Test suite names must follow pattern: feature.behavior'
            });
          }
        }
      })
    }
  }
};

Rule Configuration

Configuration File

// aitotest.config.js
module.exports = {
  rules: {
    // Built-in rules
    'coverage-threshold': ['error', { lines: 80, functions: 90 }],
    'max-test-cases': ['warn', { max: 10 }],
    
    // Custom rules
    'require-try-catch': 'error',
    'test-naming-convention': ['error', {
      pattern: '^[a-z]+\.[a-z]+$'
    }]
  },
  
  // Rule sets
  extends: [
    'aitotest:recommended',
    './custom-rules.js'
  ],
  
  // Override for specific files
  overrides: [{
    files: ['**/legacy/**'],
    rules: {
      'coverage-threshold': 'off'
    }
  }]
}

Rule Examples

Coverage Rule

{
  'min-coverage': {
    create: (context) => ({
      onTestComplete: (results) => {
        const { coverage } = results;
        if (coverage.lines < 80) {
          context.report({
            message: 'Line coverage below 80%'
          });
        }
      }
    })
  }
}

Assertion Rule

{
  'require-assertions': {
    create: (context) => ({
      TestCase: (node) => {
        if (!hasAssertions(node)) {
          context.report({
            node,
            message: 'Test must have assertions'
          });
        }
      }
    })
  }
}

Rule Categories

Testing Rules

  • Assertion count
  • Test structure
  • Mock usage
  • Setup/teardown

Quality Rules

  • Code duplication
  • Complexity
  • Naming patterns
  • Documentation

Security Rules

  • Input validation
  • Authentication
  • Data handling
  • API security

Rule Management

Enabling/Disabling Rules

// Disable for line
// aitotest-disable-next-line rule-name
function test() {}

// Disable for block
/* aitotest-disable */
function test() {}
/* aitotest-enable */

Rule Severity

  • "off" - Disable rule
  • "warn" - Warning only
  • "error" - Fail on violation
  • "info" - Information only