Pergunta

Eu estou tentando teste de carga de um serviço web.

Eu tenho um método simples que leva 2 parâmetros que são enviados para o serviço da web e retorna a resposta, e eu criei um Teste de Unidade a partir deste método.

Porque Eu quer necessidade testar diferentes entradas para testar efetivamente o serviço, fiz a configuração de um arquivo CSV com ~1000 linhas como uma fonte de dados para o Teste de Unidade.

Eu posso executar este uma Unidade de Teste e ele vai girar através de todas as linhas, sequencialmente chamando o serviço da web com valores diferentes.

No entanto, não é isso que eu preciso.Eu necessidade cada linha para corresponder a um usuário diferente em um thread diferente, usando o Teste de Carga configuração para incluir acho vezes, rampa de usuários com o passo de carga, teste de mistura de configuração, etc.

Que eu possa alcançar este removendo a minha fonte de dados de teste de unidade e de difícil codificação de valores .. mas este é fundamentalmente falho de teste: A fim de realmente testar o serviço da web, eu preciso de cada utilizador para enviar valores diferentes e obter resultados diferentes.

...

Então, como eu ligar a uma origem de dados para um teste de carga e tem que teste de carga de início de cada usuário instância de um teste de unidade com valores diferentes?

Foi útil?

Solução

Eu acabei usando essa resposta como um guia: https://stackoverflow.com/a/7813465/237723

Em vez de criar uma Unidade de Teste de aplicativo de console e método de Teste de Carga que Teste de unidade, eu criei um simples ASP.NET formulário da web, que teve as entradas e chamada de serviço da web.

Eu gravei uma Web de Teste de Desempenho usando este novo formulário, e criou um Teste de Carga para executar o que WPTest.


  1. Depois de gravar o teste, eu adicionei o arquivo CSV como uma fonte de dados para este teste.

  2. Havia 2 'Pedidos' gravado:a inicial GET & posterior. Certifique-se de deixá-los tanto!Tirei o favicon.ico pedido, porque ele não existe.(estas precauções podem ser evitáveis)

  3. Expandindo a Solicitação POST, eu modificou as propriedades da caixa de Texto parâmetros que correspondeu a minha 2 serviço web entradas para obter os respectivos valores da coluna apropriada no arquivo CSV.

  4. Eu mudei a fonte de dados método de Acesso para 'Não Mover o Cursor Automaticamente' (Você terá que expandir a fonte de dados para a tabela e editar suas propriedades através do clique com o botão direito do mouse/F4.)

  5. Eu, então, criado o WebTestPlugin (a partir vinculada resposta) que manualmente move o cursor de acordo com o id (int) que está sendo executado.Isto irá corresponder a instância de usuário de Teste de Carga gira de acordo com o plano passo.Depois de criar essa classe, criar o projecto e, em seguida, adicioná-lo ao seu Web de Teste de Desempenho.


public class webtestplugin : WebTestPlugin
{
    public override void PreWebTest(object sender, PreWebTestEventArgs e)
    {
        base.PreWebTest(sender, e);
        e.WebTest.MoveDataTableCursor("DataSource1", "addresses#csv", e.WebTest.Context.WebTestUserId);                        
    }
}

Outras dicas

Apenas a resposta a sua pergunta, eu tenho certeza que isso não pode ser feito fora da caixa de MSTest e NUnit (esta abordagem não vai ficar neste cenário).


Mas, IMHO, é só não ir lá...A partir de minha experiência, simulando ~1000 usuários de uma única máquina irá produzir ruim os resultados, pois o teste vai encontrar todos os tipos de limites de cliente - thread pool de problemas, de entrada e saída de tráfego de problemas, etc.Eu não estou dizendo que isso não pode ser superado, mas ele é torcido o suficiente para considerar uma abordagem diferente.

Eu, na verdade, não recomendamos o uso de ferramentas de teste de carga (há muitos deles lá fora) neste caso, como é simples o suficiente para escrever um pouco ferramenta de sua própria e ignorar os problemas de configuração e a curva de aprendizado de uma 3ª parte.

O que eu recomendo, é a escrita de uma ferramenta própria, e executá-lo a partir de distintas máquinas.Ele não tem que ser executado por uma estrutura de teste (I can't get-me a chamá-lo de um teste de unidade, porque não é), um aplicativo de console irá fazer o truque.Aqui está um código para você começar:

private ConcurrentBag<string> logs = new ConcurrentBag<string>();

public void GetLoad(int numberOfUsers, List<string> myParams)
{
    var users = new string[numberOfUsers];
    for (int i = 0; i < numberOfUsers; i++)
    {
        users[i] = string.Format("LoadTest{0}", i + 1);
    }

    var userThreads = new List<Thread>();
    for (int i = 0; i < numberOfUsers; i++)
    {
        int index = i;
        userThreads.Add(new Thread(()=> CallWebService(users[index], myParams[index])));
    }

    Parallel.ForEach(userThreads, thread=>thread.Start());
    foreach (var userThread in userThreads)
    {
        userThread.Join();
    }
    var outputFilename = string.Format("LoadTest.{0}Users.txt", numberOfUsers);
    File.AppendAllLines(outputFilename, logs);
}

A imagem mostra mostrar onde fazer a modificação.

 Digite a descrição da imagem aqui

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top