---
title: "Testing Methodology"
description: "How we test Formbricks to ensure reliability, performance, and high-quality code."
icon: magnifying-glass
---

## Overview

At Formbricks, we maintain a rigorous testing strategy to ensure high-quality code and reliable functionality. Our testing approach is standardized and integrated into our development workflow.

## Testing Structure

### Unit Testing with Vitest

We use Vitest as our primary testing framework. All unit tests follow these conventions:

1. **File Location and Naming**

   - Test files are co-located with the source files they test
   - Test files use the `.test.ts` extension (e.g., `utils.test.ts` tests `utils.ts`)

2. **Test Organization**

   ```typescript
   import { describe, expect, test } from "vitest";

   describe("ComponentName or FeatureName", () => {
     describe("functionName or scenario", () => {
       // We use the `test` function instead of `it` throught our test suite
       test("should describe expected behavior", () => {
         // test implementation
       });
     });
   });
   ```

3. **Coverage Requirements**
   - Minimum 85% code coverage requirement (WIP 👷‍♂️)
   - Coverage is tracked using V8 provider
   - Coverage reports include:
     - Text summaries
     - HTML reports
     - LCOV reports

### End-to-End Testing with Playwright

E2E tests are located in `apps/web/playwright/` and focus on critical user workflows.

## Testing Setup

### Configuration

Our Vitest configuration (`vite.config.ts`) includes:

```typescript
test: {
exclude: ['playwright/', 'node_modules/'],
setupFiles: ['../../packages/lib/vitestSetup.ts'],
coverage: {
provider: 'v8',
reporter: ['text', 'html', 'lcov'],
reportsDirectory: './coverage',
},
}

```

### Test Utilities

Common test utilities are available in `vitestSetup.ts`:

- Mock implementations for commonly used functions
- Test lifecycle hooks (beforeEach, afterEach)
- Validation test helpers

## Best Practices

1. **Test Independence**

   ```typescript
   beforeEach(() => {
     vi.resetModules();
     vi.resetAllMocks();
   });

   afterEach(() => {
     vi.clearAllMocks();
   });
   ```

2. **Mocking**

   - Use Vitest's built-in mocking utilities
   - Mock external dependencies and services
   - Example:

   ```typescript
   vi.mock("@formbricks/database", () => ({
     prisma: {
       user: {
         create: vi.fn(),
         findUnique: vi.fn(),
       },
     },
   }));
   ```

3. **Assertions**
   - Write clear, specific assertions
   - Test both success and error cases
   - Example:
   ```typescript
   expect(result.ok).toBe(true);
   expect(result.data).toEqual(expectedData);
   expect(async () => await invalidCall()).rejects.toThrow(ValidationError);
   ```

## Quality Assurance Process

1. **Continuous Integration**

   - Automated test suite execution on pull requests
   - Coverage reports generation
   - Test results reporting

2. **New Features**
   - Must include corresponding unit tests
   - Must maintain or improve coverage metrics
   - Must include relevant E2E tests for user-facing features
