Bots
Los bots simulan a los participantes jugando tu aplicación. Hacen clic en cada página, completan formularios y se aseguran de que todo funcione correctamente.
Esta función está diseñada para personas perezosas que preferirían que oTree probara automáticamente sus aplicaciones. Y oTree Studio incluso puede diseñar el código de tu bot, por lo que todo el proceso (escribir y ejecutar bots) requiere casi ningún esfuerzo.
Ejecutando bots
Agrega bots a tu aplicación (consulta las instrucciones a continuación)
En la configuración de tu sesión, establece
use_browser_bots=True.Ejecuta tu servidor y crea una sesión. Las páginas se reproducirán automáticamente con bots de navegador, una vez que se abran los enlaces de inicio.
Escribiendo pruebas
En oTree Studio, ve a la sección «Pruebas» de tu aplicación. Haz clic en el botón para autoescribir el código de bots. Si deseas refinar el código que se generó (como agregar declaraciones expect()), lee las secciones a continuación.
Si estás utilizando un editor de texto, ve a tests.py. Consulta ejemplos de cómo definir tests.py aquí.
Enviando páginas
Debes hacer un yield por cada envío de página. Por ejemplo:
yield pages.Start
yield pages.Survey, dict(name="Bob", age=20)
Aquí, primero enviamos la página Start, que no contiene un formulario. La siguiente página tiene 2 campos de formulario, así que enviamos un dict.
El sistema de pruebas generará un error si el bot envía una entrada no válida para una página, o si envía las páginas en el orden incorrecto.
Usas declaraciones if para jugar cualquier número de jugador o ronda. Por ejemplo:
if self.round_number == 1:
yield pages.Introduction
if self.player.id_in_group == 1:
yield pages.Offer, dict(offer=30)
else:
yield pages.Accept, dict(offer_accepted=True)
Tus declaraciones if pueden depender de self.player, self.group, self.round_number, etc.
Ignora las páginas de espera al escribir bots.
Rondas
Tu código de bot debe ejecutar solo 1 ronda a la vez. oTree lo ejecutará automáticamente NUM_ROUNDS veces.
expect()
Puedes usar declaraciones expect para asegurarte de que tu código está funcionando como esperas.
Por ejemplo:
expect(self.player.num_apples, 100)
yield pages.Eat, dict(apples_eaten=1)
expect(self.player.num_apples, 99)
yield pages.SomeOtherPage
Si self.player.num_apples no es 99, se te alertará con un error.
También puedes usar expect con 3 argumentos, como expect(self.player.budget, '<', 100). Esto verificará que self.player.budget sea menor que 100. Puedes usar los siguientes operadores: '<', '<=', '==', '>=', '>', '!=', 'in', 'not in'.
Prueba de validación de formularios
Si usas form validation, debes probar que tu aplicación está rechazando correctamente la entrada inválida del usuario, utilizando SubmissionMustFail().
Por ejemplo, digamos que tienes esta página:
class MyPage(Page):
form_model = 'player'
form_fields = ['int1', 'int2']
@staticmethod
def error_message(player, values):
if values["int1"] + values["int2"] != 100:
return 'The numbers must add up to 100'
Aquí se explica cómo probar que está funcionando correctamente:
yield SubmissionMustFail(pages.MyPage, dict(int1=99, int2=0))
yield pages.MyPage, dict(int1=99, int2=1)
El bot enviará MyPage dos veces. Si la primera presentación tiene éxito, se generará un error, porque no se supone que deba tener éxito.
Comprobando el HTML
self.html contiene el HTML de la página que estás a punto de enviar. Puedes usar esto junto con expect():
if self.player.id_in_group == 1:
expect(self.player.is_winner, True)
print(self.html)
expect('you won the game', 'in', self.html)
else:
expect(self.player.is_winner, False)
expect('you did not win', 'in', self.html)
yield pages.Results
# etc...
self.html se actualiza con el HTML de la siguiente página, después de cada declaración yield. Se ignoran los saltos de línea y los espacios extra.
Comprobaciones automáticas de HTML
Se generará un error si el bot intenta enviar campos de formulario que no se encuentran realmente en el HTML de la página, o si el HTML de la página carece de un botón de envío.
Sin embargo, el sistema de bots no puede ver campos y botones que se añaden dinámicamente con JavaScript. En estos casos, debes desactivar la comprobación de HTML utilizando Submission con check_html=False. Por ejemplo, cambia esto:
yield pages.MyPage, dict(foo=99)
a esto:
yield Submission(pages.MyPage, dict(foo=99), check_html=False)
(Si usaste Submission sin check_html=False, los dos ejemplos de código serían equivalentes.)
Simular un tiempo de espera de página
Puedes usar Submission con timeout_happened=True:
yield Submission(pages.MyPage, dict(foo=99), timeout_happened=True)
Funciones avanzadas
Consulta Bots: características avanzadas