Feature Toggles em Ruby: Implementação e Testes com RSpec

biosbug

Roberson Miguel

Posted on August 9, 2024

Feature Toggles em Ruby: Implementação e Testes com RSpec

Seguindo essa sequencia de memórias que decidi tirar das anotações e publicar, vou me aprofundar em alguns termos e praticas que já comentei nos posts anteriores.

Neste post, vamos explorar como implementar Feature Toggles em uma aplicação Ruby, integrando-os ao Rails e testando a funcionalidade com RSpec.

O que são Feature Toggles?

Feature Toggles (ou Feature Flags) são uma prática poderosa no desenvolvimento de software que permite habilitar ou desabilitar funcionalidades de forma dinâmica. Isso é particularmente útil em ambientes onde o deploy contínuo é praticado, pois permite que novas funcionalidades sejam lançadas de maneira controlada, sem impactar todos os usuários de uma vez.

Feature Toggles são switches que permitem ativar ou desativar partes do código sem a necessidade de realizar novos deploys. Eles podem ser configurados para diferentes cenários, como:

  • Lançamento de novas funcionalidades gradualmente para um pequeno grupo de usuários antes de lançar para todos.
  • Experimentos A/B testing onde diferentes grupos de usuários experimentam diferentes versões de uma funcionalidade.
  • Deploy seguro, onde funcionalidades podem ser ativadas apenas quando necessário, mesmo após serem implementadas e deployadas.

Implementação de Feature Toggles em Ruby

Para implementar Feature Toggles em uma aplicação Rails, vamos utilizar um approach simples baseado em configurações dentro do código. Vamos começar com um exemplo prático.

1. Configuração Simples de Feature Toggles

Primeiro, podemos criar uma configuração simples de Feature Toggles em config/initializers/feature_toggles.rb:

# config/initializers/feature_toggles.rb
module FeatureToggles
  FEATURES = {
    new_dashboard: false,
    beta_feature: true,
  }

  def self.enabled?(feature)
    FEATURES[feature]
  end
end
Enter fullscreen mode Exit fullscreen mode

Neste exemplo, temos dois toggles: new_dashboard e beta_feature. O new_dashboard está desativado (false), enquanto o beta_feature está ativado (true).

2. Uso de Feature Toggles no Código

Com os toggles configurados, podemos utilizá-los no código para controlar o fluxo das funcionalidades:

class DashboardController < ApplicationController
  def show
    if FeatureToggles.enabled?(:new_dashboard)
      render :new_dashboard
    else
      render :old_dashboard
    end
  end
end
Enter fullscreen mode Exit fullscreen mode

Aqui, a renderização da view depende do estado do feature toggle new_dashboard.

Testando Feature Toggles com RSpec

Vamos agora escrever testes utilizando RSpec para garantir que as funcionalidades controladas pelos toggles se comportem conforme esperado.

1. Configuração do RSpec

Certifique-se de que o RSpec está configurado no seu projeto. Você pode adicionar a gem ao seu Gemfile e executar bundle install:

group :test do
  gem 'rspec-rails'
end
Enter fullscreen mode Exit fullscreen mode

Depois, inicialize o RSpec:

rails generate rspec:install
Enter fullscreen mode Exit fullscreen mode

2. Escrevendo Testes para Feature Toggles

Agora, vamos escrever testes para verificar o comportamento da DashboardController dependendo do estado do toggle.

# spec/controllers/dashboard_controller_spec.rb
require 'rails_helper'

RSpec.describe DashboardController, type: :controller do
  describe 'GET #show' do
    context 'when new_dashboard feature is enabled' do
      before do
        allow(FeatureToggles).to receive(:enabled?).with(:new_dashboard).and_return(true)
      end

      it 'renders the new_dashboard template' do
        get :show
        expect(response).to render_template(:new_dashboard)
      end
    end

    context 'when new_dashboard feature is disabled' do
      before do
        allow(FeatureToggles).to receive(:enabled?).with(:new_dashboard).and_return(false)
      end

      it 'renders the old_dashboard template' do
        get :show
        expect(response).to render_template(:old_dashboard)
      end
    end
  end
end
Enter fullscreen mode Exit fullscreen mode

Explicação dos Testes:

  • Contexto quando new_dashboard está habilitado: Usamos allow para mockar o retorno de FeatureToggles.enabled? e forçar o retorno true. O teste então verifica se o template new_dashboard é renderizado.

  • Contexto quando new_dashboard está desabilitado: Similar ao teste anterior, mas forçando o retorno false e verificando se o template old_dashboard é renderizado.

Feature Toggles são uma ferramenta poderosa para controlar o lançamento de funcionalidades em uma aplicação. Com a abordagem apresentada, você pode começar a implementar toggles simples em sua aplicação Ruby e garantir que eles funcionem conforme esperado utilizando RSpec para testes.

Essa abordagem permite que novas funcionalidades sejam testadas em produção de forma controlada, reduzindo o risco de bugs afetarem todos os usuários de uma vez. Além disso, ao implementar testes robustos, você pode assegurar que o comportamento da aplicação se adapte corretamente à ativação ou desativação dessas funcionalidades.

💖 💪 🙅 🚩
biosbug
Roberson Miguel

Posted on August 9, 2024

Join Our Newsletter. No Spam, Only the good stuff.

Sign up to receive the latest update from our blog.

Related