Estou tentando escrever um caso de teste usando o novo teste de interface do usuário disponível no Xcode 7 beta 2. O aplicativo tem uma tela de login na qual faz uma chamada para o servidor para fazer login. Há um atraso associado a isso, pois é uma operação assíncrona.
Existe uma maneira de causar um mecanismo de atraso ou espera no XCTestCase antes de prosseguir com as etapas adicionais?
Não há documentação adequada disponível e eu examinei os arquivos de cabeçalho das classes. Não foi possível encontrar nada relacionado a isso.
Alguma idéia / sugestão?
ios
ios9
xcode-ui-testing
xcode7-beta2
xctwaiter
Tejas HS
fonte
fonte
NSThread.sleepForTimeInterval(1)
deve funcionardispatch_after
,dispatch_queue
coisas)Respostas:
O teste de interface do usuário assíncrona foi introduzido no Xcode 7 Beta 4. Para aguardar um rótulo com o texto "Olá, mundo!" Para aparecer, você pode fazer o seguinte:
Mais detalhes sobre o teste de interface do usuário podem ser encontrados no meu blog.
fonte
waitForExpectationsWithTimeout
falhará automaticamente no teste, o que é bastante lamentável.app.launch()
parece apenas reiniciar o aplicativo. Isso é necessário?Além disso, você pode apenas dormir:
Como os UITests são executados em outro processo, isso funciona. Não sei como é aconselhável, mas funciona.
fonte
usleep
iOS 11 / Xcode 9
Este é um ótimo substituto para todas as implementações personalizadas neste site!
Verifique minha resposta aqui: https://stackoverflow.com/a/48937714/971329 . Aqui, descrevo uma alternativa à espera de solicitações, o que reduzirá bastante o tempo de execução dos testes!
fonte
XCTestCase
e funciona como um encanto. Eu não entendo por que abordagens comosleep(3)
são votadas tão alto aqui, pois prolonga artificialmente o tempo de teste e não é realmente uma opção quando o seu conjunto de testes cresce.Xcode 9 introduziu novos truques com o XCTWaiter
O caso de teste aguarda explicitamente
A instância do garçom delega para testar
A classe Waiter retorna o resultado
uso de amostra
Antes do Xcode 9
Objetivo C
USO
Rápido
USO
ou
FONTE
fonte
A partir do Xcode 8.3, podemos usar
XCTWaiter
http://masilotti.com/xctest-waiting/Outro truque é escrever uma
wait
função, o crédito é dado a John Sundell por me mostrare use-o como
fonte
Com base na resposta de @ Ted , usei esta extensão:
Você pode usá-lo assim
Também permite aguardar que um elemento desapareça ou qualquer outra propriedade seja alterada (usando o bloco apropriado)
fonte
Editar:
Na verdade, me ocorreu que no Xcode 7b4, o teste da interface do usuário agora
expectationForPredicate:evaluatedWithObject:handler:
Original:
Outra maneira é girar o loop de execução por um período de tempo definido. Realmente útil apenas se você souber quanto tempo (estimado) precisará aguardar
Obj-C:
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow: <<time to wait in seconds>>]]
Rápido:
NSRunLoop.currentRunLoop().runMode(NSDefaultRunLoopMode, beforeDate: NSDate(timeIntervalSinceNow: <<time to wait in seconds>>))
Isso não é super útil se você precisar testar algumas condições para continuar seu teste. Para executar verificações condicionais, use um
while
loop.fonte
O código a seguir funciona apenas com o objetivo C.
Basta ligar para esta função, conforme indicado abaixo.
fonte
No meu caso,
sleep
criou efeito colateral, então eu useiwait
fonte
De acordo com a API do XCUIElement,
.exists
pode ser usado para verificar se uma consulta existe ou não, portanto a sintaxe a seguir pode ser útil em alguns casos!Se você tem certeza de que sua expectativa será atendida, tente executar isso. Note-se que a falha pode ser preferível se a espera for muito longa; nesse caso, a
waitForExpectationsWithTimeout(_,handler:_)
postagem de @Joe Masilotti deve ser usada.fonte
o sono bloqueará o fio
"Nenhum processamento de loop de execução ocorre enquanto o encadeamento está bloqueado."
você pode usar waitForExistence
fonte
Isso criará um atraso sem interromper o encadeamento ou gerar um erro no tempo limite:
Como a expectativa é invertida, o tempo limite é excedido.
fonte