Puppet, papéis de teste em repo de controle com beaker-rspec

1

Eu quero testar meu repositório de controle (com perfis e funções) com rspec-puppet e beaker-rspec. Ainda estou tendo alguns problemas com o beaker-rspec:

  • Gostaria de testar os perfis individualmente, por exemplo, profile::postgresql e ver se o banco de dados foi instalado.
  • Então, eu também gostaria de testar minhas funções individualmente, por exemplo role::fileserver ou role::webserver .

Eu configurei o becker-rspec e ele funciona, mas leva um tempo considerável porque ele aplicará todos os perfis um após o outro. Eu vejo os seguintes problemas nisso:

  • Se muitos perfis forem aplicados à VM do Vagrant, eles ficarão poluídos (pacotes restantes, arquivos etc. de outra execução, para que o teste não seja mais representativo)
  • Alguns perfis não têm nada em comum ou podem até mesmo contradizê-los (por exemplo, nginx vs. apache; eles nunca estarão em uma função, mas são definidos no repo de controle).

O que eu prefiro fazer é:

  • beaker-rspec deve verificar quais funções foram definidas e, em seguida, executar uma máquina virtual individual para cada uma das funções.
  • Isso deve ser feito em série ou (melhor) em paralelo.
  • Como posso reduzir o tempo para cada execução, especialmente se você tiver uma configuração Puppet bastante grande com várias funções e diferentes versões do SO etc. Talvez selecione o tipo de testes (“somente testes de função” ou “somente testes de perfil”).

Também seria ok se o beaker-rspec testasse todos os perfis em uma nova VM (mas eu gostaria de alternar os testes para outro uso).

Como posso conseguir isso? Obrigado :)

    
por Hellstorm 05.10.2016 / 19:56

1 resposta

2

Algumas respostas diferentes aqui:

beaker-rspec should check which roles have been defined and then spin up an individual virtual machine for each of the roles. These should be done either serially or (better) in parallel.

O beaker-rspec não tem a capacidade de usar um SUT completamente novo (sistema em teste) por suíte de testes. A única maneira de fazer isso agora é criar um novo arquivo _spec.rb por teste e, em seguida, executar cada teste em um novo processo, por exemplo. bundle exec rspec spec/acceptance/profile_test_one.rb && bundle exec rspec spec/acceptance/profile_test_two.rb

Para ser executado em série ou paralelo, provavelmente é melhor fazer isso em sua plataforma de CI. Assim, para o Travis (ou o Jenkins com o plugin Matrix), por exemplo, você criaria uma matriz de teste com testes diferentes por perfil, para que eles possam ser executados em paralelo. Isso requer uma máquina de teste poderosa, especialmente se você estiver usando VMs volumosas.

How can I reduce the time for each run, especially if having a rather large Puppet setup with multiple roles and different OS versions etc. Maybe select the type of tests (“only role tests” or “only profile tests”).

Quando você diz reduzir tempo, qual parte você quer dizer? Quanto tempo leva a Marionete ou quanto tempo leva a máquina a um estado testável?

O uso de instâncias do Docker acelera significativamente o estado de provisionamento da máquina.

Para acelerar a corrida do Puppet, depende do que é lento. Se for computação, torne o SUT maior, dê mais núcleos ou RAM. Para problemas dependentes da rede, você pode usar o armazenamento em cache. Por exemplo, no Mac, você pode usar o Squid para armazenar em cache todos os pacotes RPM / APT necessários

Eu geralmente não faço testes de aceitação para papéis. Os papéis são basicamente apenas meta-perfis: eles não devem ter lógica e são apenas uma coleção de perfis.

O único benefício de testar a função seria a detecção de conflitos ao usar vários perfis, mas os conflitos e as verificações de dependência podem ser melhor detectados usando rspec-puppet, em vez de um teste de aceitação.

Assim, por exemplo, um papel como:

class role::foo_blog {
  include profile::base
  include profile::nginx
  include profile::php
  include profile::mysql
}

Seria mais fácil apenas testar cada um dos quatro perfis com testes de aceitação e escrever um teste rspec-puppet para garantir que os diferentes perfis não tenham problemas ou conflitos de dependência.

    
por 06.10.2016 / 13:07