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.