Domanda

Voglio scrivere un test unit che esegue direttamente le richieste HTTP (invece di usare django.test.client.Client).

Se sei curioso del perché - è perché voglio testare un'API Thrift-over-HTTP che espongo dalla mia applicazione Django - e voglio usare il client Thrift nel unit test.

Il problema è che durante i test il server non viene effettivamente eseguito. Quando si utilizza django.test.client.Client, chiamerà semplicemente le funzioni di visualizzazione invece di effettuare una richiesta HTTP. (Per favore, correggimi se sbaglio.)

Quindi quale sarebbe il modo migliore per forzare il framework di test ad avviare il server HTTP?

Ho provato a scrivere uno script bash che fa qualcosa del genere:

./manage.py testserver --addrport 7000 &
PID=$!
sleep 5
./manage.py test --no-input
kill $PID

Ma questo è disordinato (e non funziona davvero) perché 1) Ho bisogno del sonno (altrimenti il ??test inizierà prima che il DB venga inizializzato dal server di test) e 2) il test proverà ad inizializzare nuovamente il database (dopo che il server di test lo ha già inizializzato).

Altre soluzioni a questo?

Grazie.

È stato utile?

Soluzione

Sì, hai ragione: è un problema e c'è un bug: http: / /code.djangoproject.com/ticket/2879

Solo, potresti riscontrare problemi con multithread, volutamente ommited: http://code.djangoproject.com / ticket / 10117 http://code.djangoproject.com/ticket/4513 http://code.djangoproject.com/ticket/3357

Sono frustrato, quindi ho scritto una libreria che include l'avvio del server live in thread separato e la successiva pulizia: http://devel.almad.net/trac/django-sane-testing/ . Avvia anche il server di Django multithreading dal runtime monkeypatching e puoi invece utilizzare cherrypy http (che è comunque meglio).

L'unico problema è che devi usare nose come framework di test (compatibilità al 100% con lo standard unittest, ma se stai già usando qualcos'altro ...). Puoi quindi usare --with-django e --with-djangoliveserver / - con-cherrypyliveserver. Non ho idea di come funzionerà con l'usato.

Attenzione:

  • Per favore, non disturbare gli sviluppatori Django con segnalazioni di bug, sei da solo
  • Il mulino a vento offre la stessa soluzione, quindi se stai usando il mulino a vento, probabilmente avrai conflitti di porte
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top