bytes.cat

La wiki d'FP d'informàtica

Eines de l'usuari

Eines del lloc


django_test

Diferències

Ací es mostren les diferències entre la revisió seleccionada i la versió actual de la pàgina.

Enllaç a la visualització de la comparació

Ambdós costats versió prèvia Revisió prèvia
Següent revisió
Revisió prèvia
django_test [2023/02/08 12:44]
enric_mieza_sanchez [Testejar que un element NO existeix]
django_test [2024/01/09 15:37] (actual)
enric_mieza_sanchez [Exercicis de test amb Django Tutorial]
Línia 5: Línia 5:
  
 Referències: Referències:
 +  * [[Django]] en aquesta wiki.
   * Pàgina oficial [[https://docs.djangoproject.com/en/3.2/topics/testing/|Testing in Django]]   * Pàgina oficial [[https://docs.djangoproject.com/en/3.2/topics/testing/|Testing in Django]]
   * [[https://realpython.com/testing-in-django-part-1-best-practices-and-examples/|Una pàgina interessant sobre testing amb Django]].   * [[https://realpython.com/testing-in-django-part-1-best-practices-and-examples/|Una pàgina interessant sobre testing amb Django]].
Línia 144: Línia 145:
  
 <WRAP tip> <WRAP tip>
-**Necessitaràs instal·lar el geckodriver de Firefox** per permetre automatitzar l'accés al navegador per part del codi. [[https://github.com/mozilla/geckodriver/releases|Pots descarregar el geckodriver aquí]]En Ubuntu es pot fer amb: +**Necessitaràs instal·lar el geckodriver de Firefox** per permetre automatitzar l'accés al navegador per part del codi (control remot)Des de fa algunes versions Firefox ja inclou per defecte el //driver//. 
-    $ sudo apt install firefox-geckodriver + 
-    +Per altra banda hem detectat que **les versions de Firefox de la botiga //snap// d'Ubuntu no funcionen bé per al //testing//**. Per tant, si utilitzes aquesta distribució caldrà eliminar el Firefox normal i després **instal·lar Firefox ESR** (Extended Support Release). Debian ja porta per defecte Firefox ESR. 
 + 
 +    $ sudo snap remove firefox 
 +    $ sudo apt install firefox-esr 
 També **cal instal·lar Selenium** al //virtualenv// del nostre projecte: També **cal instal·lar Selenium** al //virtualenv// del nostre projecte:
     (env) $ pip install selenium     (env) $ pip install selenium
Línia 152: Línia 157:
 </WRAP> </WRAP>
  
-Mostrem un exemple de com es pot connectar amb el panell /admin i fer un login. Hi hem afegit un control sobre el **mode //headless//** que ens permet córrer els tests sense mostrar el //browser//. Ens anirà bé per poder executar els tests en servidors sense interfície gràfica. +Mostrem un exemple de com es pot connectar amb el panell /admin i fer un //login//. Hi hem afegit un control sobre el **mode //headless//** que ens permet córrer els tests sense mostrar el //browser//. Ens anirà bé per poder executar els tests en servidors sense interfície gràfica. 
  
 <file python tests.py> <file python tests.py>
Línia 167: Línia 172:
         super().setUpClass()         super().setUpClass()
         opts = Options()         opts = Options()
-        opts.headless = True+        #opts.headless = True # DEPRECATED!
         cls.selenium = WebDriver(options=opts)         cls.selenium = WebDriver(options=opts)
         cls.selenium.implicitly_wait(5)         cls.selenium.implicitly_wait(5)
Línia 179: Línia 184:
     def test_login(self):     def test_login(self):
         self.selenium.get('%s%s' % (self.live_server_url, '/admin/login/'))         self.selenium.get('%s%s' % (self.live_server_url, '/admin/login/'))
 +        
 +        # comprovem que el títol de la pàgina és el què esperem
 +        self.assertEqual( self.selenium.title , "Log in | Django site admin" )
 +        
 +        # introduïm dades de login i cliquem el botó "Log in" per entrar
         username_input = self.selenium.find_element(By.NAME,"username")         username_input = self.selenium.find_element(By.NAME,"username")
         username_input.send_keys('admin')         username_input.send_keys('admin')
Línia 184: Línia 194:
         password_input.send_keys('admin123')         password_input.send_keys('admin123')
         self.selenium.find_element(By.XPATH,'//input[@value="Log in"]').click()         self.selenium.find_element(By.XPATH,'//input[@value="Log in"]').click()
- +         
 +        # comprovem que hem entrat al panell d'administració pel títol 
 +        self.assertEqual( self.selenium.title , "Site administration | Django site admin" ) 
 +        
         # Aquesta localització de l'element ens serveix també a mode de ASSERT         # Aquesta localització de l'element ens serveix també a mode de ASSERT
         # Si no localitza el link "Log out", ens donarà un NoSuchElementException         # Si no localitza el link "Log out", ens donarà un NoSuchElementException
-        self.selenium.find_element(By.XPATH,"//a[text()='Log out']")+        self.selenium.find_element(By.XPATH,"//button[text()='Log out']")
 </file> </file>
  
Línia 194: Línia 207:
 El mode //headless// és important ja que ens permetrà que el navegador funcioni sense el GUI, cosa que necessitem per als testos automatitzats (els servidors de test solen ser servidors sense interfície gràfica, pel què intentar obrir un navegador real fallaria al no trobar les X-windows). El mode //headless// és important ja que ens permetrà que el navegador funcioni sense el GUI, cosa que necessitem per als testos automatitzats (els servidors de test solen ser servidors sense interfície gràfica, pel què intentar obrir un navegador real fallaria al no trobar les X-windows).
  
-Fixa't en què es pot activar i desactivar el **mode //headless// del //driver// del navegador Firefox**. Si vols veure com s'obre i es fan els tests automatitzats, canvia la línia a: +Fixa't en què es pot activar i desactivar el **mode //headless// del //driver// del navegador Firefox**. Si vols inhibir la interfície gràfica del Firefox, ho notifiquem Selenium a través de les variables d'entorn
-    opts.headless False+    (env) $ MOZ_HEADLESS=1 ./manage.py tests
  
 De vegades ens interessarà veure el resultat dels tests amb el GUI, típicament per depurar i corregir els bugs quan els tests fallin. De vegades ens interessarà veure el resultat dels tests amb el GUI, típicament per depurar i corregir els bugs quan els tests fallin.
Línia 201: Línia 214:
  
  
-==== Exercici ==== 
-<WRAP todo> 
-No resulta molt còmode (i no és cap bona pràctica) haver de canviar el codi per poder deshabilitar el mode //headless// tal i com ho hem fet en el codi anterior. 
- 
-Utilitza les eines de ''django-environ'' per habilitar i deshabilitar el mode //headless// mitjançant una variable d'entorn. Caldrà que modifiquis els arxius ''settings.py'' i ''tests.py''. 
- 
-  * Per defecte els tests son sense GUI. 
-  * Si poso la variable d'entorn ''HEADLESS_TESTS=False'' hauria d'aparèixer el //browser// al passar els tests. 
-    * Es pot fer amb un ''export'':<code>$ export HEADLESS_TESTS=False 
-$ ./manage.py test</code> 
-    * També posant la variable abans de la instrucció a executar:<code>$ HEADLESS_TESTS=False ./manage.py test</code> 
-    * També es pot posar la nova variable a l'arxiu ''.env'' 
-</WRAP> 
- 
---> Solució # 
- 
-<file python settings.py> 
-HEADLESS_TESTS = env('HEADLESS_TESTS', default=True) 
-</file> 
- 
-<file python tests.py> 
-from django.conf import settings 
-#... 
-    opts.headless = settings.HEADLESS_TESTS 
-</file> 
- 
-<-- 
- 
-\\ 
  
 ===== Testejar que un element NO existeix ===== ===== Testejar que un element NO existeix =====
-En l'exemple vist es veu com comprovar que un element HTML (en l'exemple, un link "a") sí que existeix:+En l'exemple vist es veu com comprovar que un element HTML (en l'exemple, un ''button'') sí que existeix:
 <code python> <code python>
 # Aquesta localització de l'element ens serveix també a mode de ASSERT # Aquesta localització de l'element ens serveix també a mode de ASSERT
 # Si no localitza l'element, llençarà una NoSuchElementException # Si no localitza l'element, llençarà una NoSuchElementException
-self.selenium.find_element(By.XPATH,"//a[text()='Log out']" +self.selenium.find_element(By.XPATH,"//button[text()='Log out']")
 </code> </code>
  
Línia 265: Línia 249:
 <tabbox Versió amb Exception genèrica> <tabbox Versió amb Exception genèrica>
  
-En aquesta versió, capturem totes les excepcions, i en cas que no n'hi hagi cap, forcem el ''AssertionError''.+En aquesta versió, capturem totes les excepcions, i en cas que no n'hi hagi cap, llancem una ''Eception'' genèrica o bé forcem el ''AssertionError''.
  
 <file python tests.py> <file python tests.py>
Línia 273: Línia 257:
         pass         pass
     else:     else:
-        # forcem el llançament d'una excepció per donar el test per erroni 
         raise Exception("Trobat element que NO hi ha de ser")         raise Exception("Trobat element que NO hi ha de ser")
-        # també es pot fer llençant un assert+        # o bé
         assert False, "Trobat element que NO hi ha de ser"         assert False, "Trobat element que NO hi ha de ser"
 </file> </file>
Línia 304: Línia 287:
   - Entra al panell /admin i crea 2 ''Question'', i 2 ''Choice'' per a cada ''Question'' des del menú  "Add Choice". Comprova que quan accedeixes a una ''Question'', t'apareixen les seves 2 ''Choice'' als formularis //inline//.   - Entra al panell /admin i crea 2 ''Question'', i 2 ''Choice'' per a cada ''Question'' des del menú  "Add Choice". Comprova que quan accedeixes a una ''Question'', t'apareixen les seves 2 ''Choice'' als formularis //inline//.
   - Entra al panell /admin i crea 2 ''Question''. Crea 2 ''Choice'' per a cada ''Question'' dins del menú //inline// de cadascuna d'elles. Comprova que al menú "Choices" pots veure les 4 ''Choice'' creades.   - Entra al panell /admin i crea 2 ''Question''. Crea 2 ''Choice'' per a cada ''Question'' dins del menú //inline// de cadascuna d'elles. Comprova que al menú "Choices" pots veure les 4 ''Choice'' creades.
-  - Crea un usuari amb permisos de "staff". Entra amb aquest usuari al /adnin i comprova que si vol canviar la contrasenya, les restriccions de contrasenya segura funcionen (les 4 restriccions que s'enuncien al formulari, cal fer-les aparèixer).+  - Crea un usuari amb permisos de "staff". Entra amb aquest usuari a l'//admin panel// i comprova que si vol canviar la contrasenya, les restriccions de contrasenya segura funcionen (les 4 restriccions que s'enuncien al formulari, cal fer-les aparèixer).
   - Crea un usuari amb permisos de "staff" i que pugui llegir (només llegir) les ''Question'' i ''Choice''. Crea 2 ''Question'' amb 2 ''Choice'' cadascuna. Comprova que el nou usuari pot entrar i veure les ''Question'' però que no les pot editar.   - Crea un usuari amb permisos de "staff" i que pugui llegir (només llegir) les ''Question'' i ''Choice''. Crea 2 ''Question'' amb 2 ''Choice'' cadascuna. Comprova que el nou usuari pot entrar i veure les ''Question'' però que no les pot editar.
   - Crea un usuari amb permisos de "staff" i amb permís per veure (només veure) els usuaris. Crea 3 usuaris sense permisos amb el superadmin i comprova que el nou usuari pot veure'ls però no editar-los.   - Crea un usuari amb permisos de "staff" i amb permís per veure (només veure) els usuaris. Crea 3 usuaris sense permisos amb el superadmin i comprova que el nou usuari pot veure'ls però no editar-los.
 +  - Crea una ''Question'' amb 1 ''Choice'' i una ''Question'' amb 100 ''Choices'' (amb un bucle, òbviament) des del menú ''inline''. Genera un text aleatori per cadascuna d'elles. Comprova que anant al menú de ''Choices'' pots visualitzar les 101 opcions.
 +  - Crea un usuari amb permisos de //staff// però sense permisos explícits ni grups. Comprova que quan entra no pot veure ni ''Questions'' ni ''Choices'' al menú de l'//admin panel//.
  
  
 </WRAP> </WRAP>
  
django_test.1675860250.txt.gz · Darrera modificació: 2023/02/08 12:44 per enric_mieza_sanchez