DEV Community

Mohammad Waseem
Mohammad Waseem

Posted on

Streamlining Test Account Management in Microservices with TypeScript and DevOps Best Practices

Managing test accounts efficiently is a common challenge in a microservices architecture, especially when aiming for automation, consistency, and scalability. As a DevOps specialist, leveraging TypeScript can significantly enhance the robustness and maintainability of your testing workflows.

Introduction

In complex systems composed of multiple microservices, tests often require dedicated accounts with specific permissions and configurations. Manual management leads to errors, inconsistency, and slow releases. Automating this process through a centralized, type-safe approach simplifies test setup and teardown, while integrating with CI/CD pipelines.

Architecture and Approach

Our solution involves creating a dedicated Test Account Service, implemented in TypeScript, that manages the lifecycle of test accounts across various microservices. Key considerations include:

  • Secure storage of credentials
  • Idempotent account creation
  • Easy integration with CI pipelines
  • Scalability and isolation

Implementation Details

Using TypeScript, we define a generic interface for managing test accounts, allowing for extensibility across different services.

interface TestAccount {
  id: string;
  username: string;
  password: string;
  permissions: string[];
}

class TestAccountManager {
  private storage: Map<string, TestAccount> = new Map();

  constructor(private serviceName: string) {}

  async createAccount(permissions: string[]): Promise<TestAccount> {
    const id = `${this.serviceName}-${Date.now()}`;
    const account: TestAccount = {
      id,
      username: `${this.serviceName}_test_${Date.now()}`,
      password: this.generatePassword(),
      permissions,
    };
    this.storage.set(id, account);
    // Persist to a secure vault or database
    await this.persistAccount(account);
    return account;
  }

  async deleteAccount(accountId: string): Promise<void> {
    this.storage.delete(accountId);
    // Remove from persistent storage
    await this.removePersistedAccount(accountId);
  }

  private generatePassword(): string {
    return Math.random().toString(36).slice(-8);
  }

  private async persistAccount(account: TestAccount): Promise<void> {
    // Store securely, e.g., HashiCorp Vault, AWS Secrets Manager
    // For demo, just a console log
    console.log(`Persisting account ${account.id}`);
  }

  private async removePersistedAccount(accountId: string): Promise<void> {
    console.log(`Removing account ${accountId}`);
  }
}
Enter fullscreen mode Exit fullscreen mode

This class encapsulates account creation and deletion, ensuring consistent handling of sensitive information. Cookies, tokens, or API calls to external vaults are integrated in the persistAccount and removePersistedAccount methods.

CI/CD Integration

Incorporating this management class within CI pipelines guarantees creation of fresh accounts for each test run, avoiding state pollution:

async function setupTestAccounts() {
  const userAccountManager = new TestAccountManager('userService');
  const adminAccountManager = new TestAccountManager('adminService');

  const userAccount = await userAccountManager.createAccount(['read', 'write']);
  const adminAccount = await adminAccountManager.createAccount(['admin']);

  // Pass account details to test suite
  return { userAccount, adminAccount };
}

async function teardownTestAccounts(accounts: { userAccount: TestAccount; adminAccount: TestAccount }) {
  await new TestAccountManager('userService').deleteAccount(accounts.userAccount.id);
  await new TestAccountManager('adminService').deleteAccount(accounts.adminAccount.id);
}
Enter fullscreen mode Exit fullscreen mode

Final Thoughts

This approach ensures test accounts are created and disposed of systematically, fostering isolation and repeatability. TypeScript's type safety enforces correct usage, and the modular class structure promotes code reuse across different microservices.

By integrating such a service into your DevOps pipeline, you improve security, reduce manual errors, and accelerate release cycles—core principles of effective DevOps practices.


🛠️ QA Tip

To test this safely without using real user data, I use TempoMail USA.

Top comments (0)