CursosEmpresasBlogLiveConfPrecios

Preparar assertions y test suites

Clase 8 de 24 • Curso de Introducción a Selenium con Python

Clase anteriorSiguiente clase

Contenido del curso

Conocer el ecosistema de Selenium
  • 1
    Por qué aprender Selenium y qué verás

    Por qué aprender Selenium y qué verás

    03:15
  • 2
    Historia de Selenium

    Historia de Selenium

    09:05
  • 3
    Otras herramientas de testing y automatización

    Otras herramientas de testing y automatización

    03:40
Preparar entorno de trabajo
  • 4
    Configurar entorno de trabajo

    Configurar entorno de trabajo

    01:43
  • 5

    Compatibilidad con Python 3.9 y aprendiendo a utilizar múltiples versiones

    01:44
  • 6
    ¡Hola, mundo!

    ¡Hola, mundo!

    11:51
Utilizar comandos básicos
  • 7
    Encontrar elementos con find_element

    Encontrar elementos con find_element

    15:23
  • 8
    Preparar assertions y test suites

    Preparar assertions y test suites

    13:50
  • 9

    Entender las clases WebDriver y WebElement

    01:18
Interactuar con elementos
  • 10
    Manejar form, textbox, checkbox y radio button

    Manejar form, textbox, checkbox y radio button

    13:37
  • 11
    Manejar dropdown y listas

    Manejar dropdown y listas

    07:42
  • 12
    Manejar alert y pop-up

    Manejar alert y pop-up

    06:05
  • 13
    Automatizar navegación

    Automatizar navegación

    03:54
Sincronizar pruebas
  • 14
    Demora implícita y explícita

    Demora implícita y explícita

    08:38
  • 15

    Condicionales esperadas

    00:44
Retos
  • 16
    Agregar y eliminar elementos

    Agregar y eliminar elementos

    09:16
  • 17
    Elementos dinámicos

    Elementos dinámicos

    06:46
  • 18
    Controles dinámicos

    Controles dinámicos

    08:01
  • 19
    Typos

    Typos

    05:43
  • 20
    Ordenar tablas

    Ordenar tablas

    07:12
Metodologías de Trabajo
  • 21
    Data Driven Testing (DDT)

    Data Driven Testing (DDT)

    13:35
  • 22
    Page Object Model (POM)

    Page Object Model (POM)

    10:35
Cierre del curso
  • 23
    Realizar una prueba técnica

    Realizar una prueba técnica

    11:33
  • 24
    Conclusiones

    Conclusiones

    01:43
    Korpi delfin

    Korpi delfin

    student•
    hace 5 años

    Les comparto el código ya con documentación.

    Assertions

    import unittest from selenium import webdriver #sirve como excepción para los assertions cuando queremos #validar la presencia de un elemento from selenium.common.exceptions import NoSuchElementException #ayuda a llamar a las excepciones que queremos validar from selenium.webdriver.common.by import By class AssertionsTest(unittest.TestCase): def setUp(self): self.driver = webdriver.Chrome(executable_path = r'.\chromedriver.exe') driver = self.driver driver.implicitly_wait(30) driver.maximize_window() driver.get("http://demo.onestepcheckout.com/") def test_search_field(self): self.assertTrue(self.is_element_present(By.NAME, 'q')) def test_language_option(self): self.assertTrue(self.is_element_present(By.ID, 'select-language')) def tearDown(self): self.driver.quit() #para saber si está presente el elemento #how: tipo de selector #what: el valor que tiene def is_element_present(self, how, what): try: #busca los elementos según el parámetro self.driver.find_element(by = how, value = what) except NoSuchElementException as variable: return False return True

    Search tests

    import unittest from pyunitreport import HTMLTestRunner from selenium import webdriver class SearchTests(unittest.TestCase): def setUp(self): self.driver = webdriver.Chrome(executable_path = r'.\chromedriver.exe') driver = self.driver driver.implicitly_wait(30) driver.maximize_window() driver.get("http://demo.onestepcheckout.com") def test_search_tee(self): driver = self.driver search_field = driver.find_element_by_name('q') search_field.clear() #limpia el campo de búsqueda en caso de que haya algún texto. search_field.send_keys('tee') #simulamos la escritura del teclado para poner "tee" search_field.submit() #envía los datos ('tee') para que la página muestre los resultados de "tee" def test_search_salt_shaker(self): driver = self.driver search_field = driver.find_element_by_name('q') search_field.send_keys('salt shaker') #escribimos 'salt shaker' en la barra de búsqueda search_field.submit() #envíamos la petición #hago una lista de los resultados buscando los elementos por su Xpath. Es la forma más rápida. products = driver.find_elements_by_xpath('//*[@id="top"]/body/div/div[2]/div[2]/div/div[2]/div[2]/div[3]/ul/li/div/h2/a') #vamos a preguntar si la cantidad de resultados es igual a 1 self.assertEqual(1, len(products)) def tearDown(self): self.driver.quit()

    Smoke tests

    from unittest import TestLoader, TestSuite from pyunitreport import HTMLTestRunner #para generar el reporte from assertions import AssertionsTest from search_tests_assertions import SearchTests assertions_test = TestLoader().loadTestsFromTestCase(AssertionsTest) search_tests = TestLoader().loadTestsFromTestCase(SearchTests) #contruimos la suite de pruebas smoke_test = TestSuite([assertions_test, search_tests]) #para generar los reporters kwargs = { "output": 'smoke-report' } #la variable runner almacena un reporte generado por HTMLTestRuner #usa como argumento "kwarsp" runner = HTMLTestRunner(**kwargs) #corro el rurner con la suite de prueba runner.run(smoke_test)
      Andrés Corral

      Andrés Corral

      student•
      hace 5 años

      gracias

      Gabriel Martin Estrada

      Gabriel Martin Estrada

      student•
      hace 5 años

      Muchas gracias!!!!

    Facundo Soto

    Facundo Soto

    student•
    hace 4 años

    No me gusta ser el negativo pero este curso me parece desastroso, está lleno de cosas no explicadas o implícitas o también cosas esenciales explicadas de manera vaga

      Mario Alberto Treviño

      Mario Alberto Treviño

      student•
      hace 4 años

      Justo entre a los comentarios para ver si era impresión mía o si esta muy mal explicado.

      Fredy Alexander Izquierdo Dominguez

      Fredy Alexander Izquierdo Dominguez

      student•
      hace 4 años

      Pienso igual.

    Andrés Xavier Vargas Vera

    Andrés Xavier Vargas Vera

    student•
    hace 4 años

    Al parecer el código que muestra el profesor no guarda los reportes de los test cases, cuando se evalúan en un Suite, porque solo guarda el reporte del último Test Case....

    Yo logré solucionarlo, al parecer hay que instalar otra librería, la librería que nos hace instalar el profesor al parecer es un fork de esta otra librería que tiene muchas mas funcionalidades y está actualizada constantemente.

    Screenshot 2021-06-09 164748.png

    pip install html-testRunner

    https://github.com/oldani/HtmlTestRunner

    Esta otra librería se importa: ANTES:

    from pyunitreport import HTMLTestRunner

    AHORA:

    from HtmlTestRunner import HTMLTestRunner

    y cuando se prueba Test Cases es igual que antes, no mas que ahora guarda los archivos con un mobre raro, si alguien logra descubrir como evitar esto, estaría agradecido:

    Screenshot 2021-06-09 170330.png

    Un pequeño cambio, en output, para guardar en carpetas destro de reports, se agrega esto:

    Screenshot 2021-06-09 165300.png

    El add_timestamps es para agregar la fecha y hora al nombre del archivo, no me gustó, por eso le pongo FALSE, pero si desean le pueden dejar TRUE

    En cuanto para Suites, resuelve el problema que están teniendo: Lo unico que cambia son los kwargs y los imports dados anteriormente

    kwargs = { "output": "reports/smoke-report", "report_name": "smoke-report", "combine_reports": True, "add_timestamp": False } # ? create runner with the parameters and run runner = HTMLTestRunner(**kwargs) runner.run(smoke_test)

    En este caso el nombre del archivo si se guarda con el nombre que se le da

    Screenshot 2021-06-09 170127.png

    Y ahora se crea un solo reporte para todos los test cases en el suite

    Screenshot 2021-06-09 170215.png

      Tomas Jesus Escobar Cueltan

      Tomas Jesus Escobar Cueltan

      student•
      hace 4 años

      Muchas gracias amigo por tomarte el tiempo de explicar esta parte, muy importante saberlo.

      Jesús Enrique Morocoima Marcano

      Jesús Enrique Morocoima Marcano

      student•
      hace 4 años

      Super

    Pablo Rivera Sepúlveda

    Pablo Rivera Sepúlveda

    student•
    hace 3 años

    El tema de automatizacion es increible... lastima la explicacion de este curso, que desastre!!!

      Manuel Rodrigo Zamorano Jimenez

      Manuel Rodrigo Zamorano Jimenez

      student•
      hace 3 años

      Así es ..!

      Julian Crispin

      Julian Crispin

      student•
      hace 3 años

      Este curso es de los peores, enredado, dificil de seguir, una pesadilla

    Carlos Andres Ocampo Pabon

    Carlos Andres Ocampo Pabon

    student•
    hace 5 años

    Para los que no entendimos el porqué se el doble asterisco cuando se está pasando el **kwargs al HTMLTestRunner, aquí dejo un articulo donde explican:

    Explicación **kwargs

      Cesar Sosa

      Cesar Sosa

      student•
      hace 5 años

      Heroe, gracias! ya entendí mejor el código de esta clase.

    David Rodriguez

    David Rodriguez

    student•
    hace 5 años

    Excelente Clase Héctor, Esto es súper útil para no hacer múltiples ejecuciones. Interesante que al no agregar el campo report_name se guarda con el dia y hora de la ejecución.

    David Diaz

    David Diaz

    student•
    hace 3 años

    Buenas noches, compañeros! Si en algún momento alguien llegase a tener problema con:

    • Solo me genera un reporte con 2 tests cuando fueron 4
    • Si el elemento no existe me tira errores raros

    Les traigo la solución a ambos.

    Assertions

    import unittest from selenium import webdriver from selenium.common.exceptions import NoSuchElementException from selenium.webdriver.common.by import By from selenium.webdriver.chrome.service import Service from webdriver_manager.chrome import ChromeDriverManager class AssertionsTest(unittest.TestCase): @classmethod def setUp(self): self.driver = webdriver.Chrome(service=Service(ChromeDriverManager().install())) driver = self.driver driver.implicitly_wait(30) driver.maximize_window() driver.get("Platzi decía que el sitio no era seguro.com") def test_search_field(self): print('Searching the search bar') self.assertTrue(self.is_element_present(By.NAME, 'q')) def test_language_option(self): print('Searching the Select language dropdown') self.assertTrue(self.is_element_present(By.ID, 'iselect-language')) @classmethod def tearDown(self): self.driver.quit() def is_element_present(self, how, what): try: self.driver.find_element(by=how, value=what) except NoSuchElementException(): self.driver.close() return False return True

    (Ojo, lo deje como "iselect-language" para que vean que ejecuta el código completa aún cuando algún elemento no exista)

    Search Test

    import unittest from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By from webdriver_manager.chrome import ChromeDriverManager class SearchTests(unittest.TestCase): @classmethod def setUp(self): self.driver = webdriver.Chrome(service=Service(ChromeDriverManager().install())) driver = self.driver driver.implicitly_wait(30) driver.maximize_window() driver.get("Platzi no dejo poner el URL :c") def test_search_tee(self): driver = self.driver search_field = driver.find_element(By.NAME, "q") search_field.clear() search_field.clear() search_field.send_keys('tee') search_field.submit() def test_search_salt_shaker(self): driver = self.driver search_field = driver.find_element(By.NAME, "q") search_field.clear() search_field.send_keys('salt shaker') search_field.submit() #Searching by XPATH -> $x('//div[@class = "product-info"]/h2[@class="product-name"]/a/text()').map(x => x.wholeText) or $x('//div[@class = "product-info"]/h2/a/text()').map(x => x.wholeText) # REMEMBER: "h2" could also be replaced by "text-fill" products = driver.find_elements(By.XPATH, '//div[@class = "product-info"]/h2[@class="product-name"]/a') self.assertEqual(1, len(products)) @classmethod def tearDown(self): self.driver.quit()

    Finalmente... Smoke Tests

    from unittest import TestLoader, TestSuite from assertions import AssertionsTest from searchtests import SearchTests from HtmlTestRunner import HTMLTestRunner assertions_test = TestLoader().loadTestsFromTestCase(AssertionsTest) search_tests = TestLoader().loadTestsFromTestCase(SearchTests) #contruimos la suite de pruebas smoke_test = TestSuite([assertions_test, search_tests]) # Aquí generamos nuestros reportes kwargs = { "output": "reports/smoke-report", "report_name": "smoke-report", "combine_reports": True, "add_timestamp": True } runner = HTMLTestRunner(**kwargs) runner.run(smoke_test)

    Como pueden notar, la sección importante es la sección de "kwargs", aquí usamos "combine_reports": True para que los 4 reportes puedan estar juntos. Espero esto les ayude y así evitan horas de busquedas para solucionar esos problemas.

    Gracias por sus atenciones y HAPPY CODING!

      Jose Leonardo Araya Parajeles

      Jose Leonardo Araya Parajeles

      student•
      hace 3 años

      como lograste hacer funcionar el: from HtmlTestRunner import HTMLTestRunner he buscado pero no logro instalarlo

      Eduardo Pérez

      Eduardo Pérez

      student•
      hace 3 años

      Hola Jose, que error te esta saliendo?

    Julio César Zaravia Paredes

    Julio César Zaravia Paredes

    student•
    hace 5 años

    ¡Hola Comunidad! . En un video anterior dejé una respuesta con una explicación sobre este error 👇👇👇 .

    chromium_error-2.jpg
    . Ya que quizá este error le esté apareciendo a algunos de ustedes (como a mí) aprovecho en dejarlo por aquí como un aporte: . Según pude revisar (porque a mi también me pasó 😔) este error se debe a que el Driver intenta generar una nueva sesión del navegador Chrome y para esto hace una serie de validaciones, una de las validaciones tiene que ver con ++la interfaz webUSB (que permite el acceso a dispositivos USB desde una página web)++, es en este punto en que se genera el error. . ++¿Por qué se genera el error?++ ¿Por qué se genera el error? Parece que no tiene nada que ver con tus entradas USB 😅 sino que parece ser que es un error de Chromium, según he podido leer ya fue notificado para su revisión. . ++Y, ¿Qué hacemos?++ No lo sé 🤠 ... Pero he leído que el error no impide la generación de un nuevo contexto de navegación, es decir tu navegador debería abrirse y cargar la web y ejecutar los tests que hayas programado sin ser afectados. . En mi caso he notado que la ejecución a pesar de mostrar el error termina en status OK, he podido visualizar que el navegador se abre como de costumbre y me ha generado los reportes de manera satisfactoria, sin embargo estoy haciendo más pruebas mientras avanzo el curso. .
    error_webUSB.jpg
    . Pero no podría decirles más. Esperemos que puedan solucionar esto y sigamos haciendo pruebas para ver ++si en realidad afecta nuestro trabajo++ o no. . Trataré de actualizar este comentario si encuentro algo más, por lo pronto les dejo esta discusión en SO que me sirvió de mucho y de la que extraje algunos de los datos que acabo de comentar. . Si alguien lee esto y está más enterado que yo del asunto o ha visto que me he equivocado en algo, o en todo 😐, por favor lo comenta y así aprendemos todos. . ¡Saludos!

      Sergio Bryan Madrid Nuñez

      Sergio Bryan Madrid Nuñez

      student•
      hace 4 años

      Puedes utilizar el WebDriver de Firefox. https://pythonbasics.org/selenium-firefox/, aquí pueden encontrar un blog que explica como hacerlo. En lugar de instalar el webdriver de chrome, hay que utilizar algo similar llamado geckodriver que pueden descargar aquí: https://github.com/mozilla/geckodriver/releases, sólo dejan el archivo descomprimido en el mismo nivel en el que tengan su código o señalan la ruta del geckodriver como hacemos en el curso. Ahora seria: webdriver.Firefox()

      Sebastián Franco

      Sebastián Franco

      student•
      hace 4 años

      A mi tambien me daba el error de USB, pero era porque en la función test_lenguage_option() el assert de lenguaje tenía escrito "select-lenguage" en vez de "select-language", fue corregirlo y todo fluyó. Puede que a alguien más le sirva.

    Ricardo Moreno

    Ricardo Moreno

    student•
    hace 5 años

    *Actualización Para el día de hoy ya no aparece el item de Language por lo tanto es test falla en esa parte

    Saludos!

      Julian Ramirez Chacon

      Julian Ramirez Chacon

      student•
      hace 5 años

      A día de hoy select-language si sirve, la prueba pasa sin ningún problema

      Ricardo Moreno

      Ricardo Moreno

      student•
      hace 5 años

      Gracias por la info, al momento que realicé el curso no pasaba el test y era porque no estaba la opcion del lenguaje... supongo que no lo vi o algo cambio jaja.

      Saludos!

    Juan Francisco Pons

    Juan Francisco Pons

    student•
    hace 3 años

    Es un quilombo esta clase! Pésimo todo. Salta de la nada a otro archivo con el mismo nombre pero distinto contenido.

      Manuel Rodrigo Zamorano Jimenez

      Manuel Rodrigo Zamorano Jimenez

      student•
      hace 3 años

      Asi es ..

    Agustin Zamar

    Agustin Zamar

    student•
    hace 5 años

    Hola! Cuando se genera el reporte de la suite de tests smoketests solo muestra reportes de los tests del ultimo archivo ejecutado. ¿Hay alguna forma de que el reporte incluya a todos los tests? ¿O que se cree un archivo para cada uno?

      Gabriel Ichcanziho Pérez Landa

      Gabriel Ichcanziho Pérez Landa

      student•
      hace 5 años

      tengo exactamente el mismo problema :( y al parecer no soy el único

      Víctor Mazo

      Víctor Mazo

      student•
      hace 4 años

      La única forma que encontré fue ingresar cada test de forma separada en el TestSuite(), sin notación de lista, más creo que se pierde la ventaja de utilizar el test suite.

    Boris Saavedra

    Boris Saavedra

    student•
    hace 5 años

    El profe no lo mencionó, pero si corren el Test Suite y colocan el parámetro report_name los reportes (obviamente) se sobrescriben y solo verán un reporte. Es por eso que conviene no colocar este parámetro.

    De nada 🤣

      Alejandro Benjamín Like García

      Alejandro Benjamín Like García

      student•
      hace 5 años

      aunque no coloques el report_name se siguen sobrescribiendo. figuran con la misma hora y segundo

    Felipe Alexis Moreno Durán

    Felipe Alexis Moreno Durán

    student•
    hace 5 años

    Estimados el codigo a continuación:

    assertions.py

    import unittest from selenium import webdriver from selenium.common.exceptions import NoSuchElementException from selenium.webdriver.common.by import By class AssertionsTest(unittest.TestCase): def setUp(self): self.driver = webdriver.Chrome(executable_path = r'C:\Python Scripts\curso_selenium\chromedriver.exe') driver = self.driver driver.implicitly_wait(30) driver.maximize_window() driver.get("http://demo-store.seleniumacademy.com/") def test_search_field(self): self.assertTrue(self.is_element_present(By.NAME, 'q')) def test_language_option(self): self.assertTrue(self.is_element_present(By.ID, 'select-language')) def tearDown(self): self.driver.quit() def is_element_present(self, how, what): try: self.driver.find_element(by = how, value = what) except NoSuchElementException as variable: return False return True``` searchtests.py

    import unittest from pyunitreport import HTMLTestRunner from selenium import webdriver

    class SearchTests(unittest.TestCase):

    def setUp(self): self.driver = webdriver.Chrome(executable_path = r'C:\Python Scripts\curso_selenium\chromedriver.exe') driver = self.driver driver.implicitly_wait(30) driver.maximize_window() driver.get("http://demo-store.seleniumacademy.com/") def test_search_tee(self): driver = self.driver search_field = driver.find_element_by_name('q') search_field.clear() search_field.send_keys('tee') search_field.submit() def test_search_salt_shaker(self): driver = self.driver search_field = driver.find_element_by_name('q') search_field.send_keys('salt shaker') search_field.submit() products = driver.find_elements_by_xpath('//*[@id="top"]/body/div/div[2]/div[2]/div/div[2]/div[2]/div[3]/ul/li/div/h2/a') self.assertEqual(1, len(products)) def tearDown(self): self.driver.quit()```

    smoketests.py

    from unittest import TestLoader, TestSuite from pyunitreport import HTMLTestRunner from assertions import AssertionsTest from searchtests import SearchTests assertions_test = TestLoader().loadTestsFromTestCase(AssertionsTest) search_tests = TestLoader().loadTestsFromTestCase(SearchTests) #Construccion de suite de pruebas smoke_test = TestSuite([assertions_test, search_tests]) #Respecto a los reportes kwargs = { "output": 'smoke-report' } runner = HTMLTestRunner(**kwargs) runner.run(smoke_test)``` Exito y saludos
    John Steven González

    John Steven González

    student•
    hace 4 años

    Cuando se utiliza el decorador @classmethod la prueba dura muchísimo menos, hablando en tiempo.

    Leslie Paz Ore

    Leslie Paz Ore

    student•
    hace 4 años

    Una consulta compañeros, aún no comprendo bien cuál es la funcionalidad de

    verbosity=2

    Podrían ayudarme, please?

      Miguel Andres Rendon Reyes

      Miguel Andres Rendon Reyes

      student•
      hace 4 años

      Hola Leslor, te explico brevemente, que la función del parámetro verbosity es para definir, qué tantas explicaciones queremos por parte de unittest. Es decir, qué tanto texto quieres que aparezca en medio de la prueba. Puedes probar poner 1 y verás cómo casi no te va a decir nada en la terminal. Es como si con verbosity, le pides que sea verbal, que explique más detalladamente.

      Leslie Paz Ore

      Leslie Paz Ore

      student•
      hace 4 años

      Muchas Gracias Umi! , Realize el cambio de verbosity a 1, pero me salen las mismas lineas que cuando le pongo 3 o 4, Supongo que mientras más complejo sea el Test Case, lograré ver la diferencia. Thanks! :)

    Jessica Martinez Freire

    Jessica Martinez Freire

    student•
    hace 5 años

    No se por que, pero el xpath aparentemente cambió y colocando (1, len (products)) no da, sale AssertionError: 1 != 0.

    Mi xpath sale: '//*[@id="top"]/body/div/div[2]/div[2]/div/div[2]/div[1]/div[4]/ul/li/div/h2/a'

    Y el xpath del video sale: '//*[@id="top"]/body/div/div[2]/div[2]/div/div[2]/div[2]/div[3]/ul/li/div/h2/a'

    ¿Como me doy cuenta en este caso? porque la logica esta bien, pero copio el xpath de la pagina y no me da (hoy por hoy), pero si uso el xpath del video si me da.

    < def test_search_salt_shaker(self): driver = self.driver search_field = driver.find_element_by_name('q') search_field.send_keys('salt shaker') search_field.submit() products = driver.find_elements_by_xpath('//*[@id="top"]/body/div/div[2]/div[2]/div/div[2]/div[2]/div[3]/ul/li/div/h2/a') self.assertEqual(1, len(products))>
      Julian Ramirez Chacon

      Julian Ramirez Chacon

      student•
      hace 5 años

      Tienes mal la ruta XPATH , la ruta es:

      products = driver.find_elements_by_xpath('/html/body/div/div[2]/div[2]/div/div[2]/div[2]/div[3]/ul/li/div/h2/a')
      Angela Nipitella

      Angela Nipitella

      student•
      hace 5 años

      Me pasaba lo mismo. Resulta que cuando le daba a inspeccionar la pagina cambiaba de tamaño poder desplegar el menú de desarrolladores de chrome. Al copiar el xpath lo estaba haciendo en una vista adaptada para móviles. esto lleva a tu portapapeles un xpath diferente al de una vista para monitor de pc. Lo pude solucionar en el menú de opciones de la consola de desarrolladores de chrome para que al darle al botón de inspeccionar se abra esta consola en una ventana nueva, dejando intacto el tamaño original de la web.

    Miguel Rodriguez Perez

    Miguel Rodriguez Perez

    student•
    hace 3 años

    Este curso es maravilloso para el que tiene cierto nivel en python, si eres nuevo tomando el curso y no tienes experiencia resolviendo los problemas mas comunes al programar y buscar documentación probablemente se te complique un poco mas de lo habitual y creas que se tiene que estar explicando todo lo que escribe el profesor.

    Luis Jhonayquer Zapata Yamo

    Luis Jhonayquer Zapata Yamo

    student•
    hace 4 años

    Al parecer Selenium a la hora de ejecutar los test lo hace en función al orden alfabético según del nombre las funciones de los test.

    Karla Berenice

    Karla Berenice

    student•
    hace 5 años

    Hola, saben como se le puede hacer para que se genere un solo archivo de resultados con todos los casos de prueba de todas las clases, es que conmigo me genera uno, pero solo de la última clase ejecutada

      Agustin Zamar

      Agustin Zamar

      student•
      hace 5 años

      Hola! ¿Pudiste encontrar alguna solucion a esto?

      Andrés Xavier Vargas Vera

      Andrés Xavier Vargas Vera

      student•
      hace 4 años

      Yo logré solucionarlo al parecer hay que instalar otra librería, la librería que nos hace instalar el profesor al parecer es un fork de esta otra librería que tiene muchas mas funcionalidades y está actualizada constantemente.

      Screenshot 2021-06-09 164748.png

      pip install html-testRunner

      https://github.com/oldani/HtmlTestRunner

      Esta otra librería se importa: ANTES:

      from pyunitreport import HTMLTestRunner

      AHORA:

      from HtmlTestRunner import HTMLTestRunner

      y cuando se prueba Test Cases es igual que antes, no mas que ahora guarda los archivos con un mobre raro, si alguien logra descubrir como evitar esto, estaría agradecido:

      Screenshot 2021-06-09 170330.png

      Un pequeño cambio, en output, para guardar en carpetas destro de reports, se agrega esto:

      Screenshot 2021-06-09 165300.png

      El add_timestamps es para agregar la fecha y hora al nombre del archivo, no me gustó, por eso le pongo FALSE, pero si desean le pueden dejar TRUE

      En cuanto para Suites, resuelve el problema que están teniendo: Lo unico que cambia son los kwargs y los imports dados anteriormente

      kwargs = { "output": "reports/smoke-report", "report_name": "smoke-report", "combine_reports": True, "add_timestamp": False } # ? create runner with the parameters and run runner = HTMLTestRunner(**kwargs) runner.run(smoke_test)

      En este caso el nombre del archivo si se guarda con el nombre que se le da

      Screenshot 2021-06-09 170127.png

      Y ahora se crea un solo reporte para todos los test cases en el suite

      Screenshot 2021-06-09 170215.png

    jesus alberto negrin guerrero

    jesus alberto negrin guerrero

    student•
    hace 5 años

    Excelente tema y profesor, de hecho justo un error que comento cuando buscamos el xpath que es poner (elements) plural valga la redundancia casi se me explotaba la cabeza porque lo buscaba en singular y me arrojaba un error lo lei como 3 veces hasta que me di cuenta por el siemple hecho de no prestar atencion XD

      Héctor Daniel Vega Quiñones

      Héctor Daniel Vega Quiñones

      teacher•
      hace 5 años

      Muchas gracias por el comentario, Jesús. En efecto hay que estar muy atentos cuando queremos identificar uno o varios elementos :eyes:

Escuelas

  • Desarrollo Web
    • Fundamentos del Desarrollo Web Profesional
    • Diseño y Desarrollo Frontend
    • Desarrollo Frontend con JavaScript
    • Desarrollo Frontend con Vue.js
    • Desarrollo Frontend con Angular
    • Desarrollo Frontend con React.js
    • Desarrollo Backend con Node.js
    • Desarrollo Backend con Python
    • Desarrollo Backend con Java
    • Desarrollo Backend con PHP
    • Desarrollo Backend con Ruby
    • Bases de Datos para Web
    • Seguridad Web & API
    • Testing Automatizado y QA para Web
    • Arquitecturas Web Modernas y Escalabilidad
    • DevOps y Cloud para Desarrolladores Web
  • English Academy
    • Inglés Básico A1
    • Inglés Básico A2
    • Inglés Intermedio B1
    • Inglés Intermedio Alto B2
    • Inglés Avanzado C1
    • Inglés para Propósitos Específicos
    • Inglés de Negocios
  • Marketing Digital
    • Fundamentos de Marketing Digital
    • Marketing de Contenidos y Redacción Persuasiva
    • SEO y Posicionamiento Web
    • Social Media Marketing y Community Management
    • Publicidad Digital y Paid Media
    • Analítica Digital y Optimización (CRO)
    • Estrategia de Marketing y Growth
    • Marketing de Marca y Comunicación Estratégica
    • Marketing para E-commerce
    • Marketing B2B
    • Inteligencia Artificial Aplicada al Marketing
    • Automatización del Marketing
    • Marca Personal y Marketing Freelance
    • Ventas y Experiencia del Cliente
    • Creación de Contenido para Redes Sociales
  • Inteligencia Artificial y Data Science
    • Fundamentos de Data Science y AI
    • Análisis y Visualización de Datos
    • Machine Learning y Deep Learning
    • Data Engineer
    • Inteligencia Artificial para la Productividad
    • Desarrollo de Aplicaciones con IA
    • AI Software Engineer
  • Ciberseguridad
    • Fundamentos de Ciberseguridad
    • Hacking Ético y Pentesting (Red Team)
    • Análisis de Malware e Ingeniería Forense
    • Seguridad Defensiva y Cumplimiento (Blue Team)
    • Ciberseguridad Estratégica
  • Liderazgo y Habilidades Blandas
    • Fundamentos de Habilidades Profesionales
    • Liderazgo y Gestión de Equipos
    • Comunicación Avanzada y Oratoria
    • Negociación y Resolución de Conflictos
    • Inteligencia Emocional y Autogestión
    • Productividad y Herramientas Digitales
    • Gestión de Proyectos y Metodologías Ágiles
    • Desarrollo de Carrera y Marca Personal
    • Diversidad, Inclusión y Entorno Laboral Saludable
    • Filosofía y Estrategia para Líderes
  • Diseño de Producto y UX
    • Fundamentos de Diseño UX/UI
    • Investigación de Usuarios (UX Research)
    • Arquitectura de Información y Usabilidad
    • Diseño de Interfaces y Prototipado (UI Design)
    • Sistemas de Diseño y DesignOps
    • Redacción UX (UX Writing)
    • Creatividad e Innovación en Diseño
    • Diseño Accesible e Inclusivo
    • Diseño Asistido por Inteligencia Artificial
    • Gestión de Producto y Liderazgo en Diseño
    • Diseño de Interacciones Emergentes (VUI/VR)
    • Desarrollo Web para Diseñadores
    • Diseño y Prototipado No-Code
  • Contenido Audiovisual
    • Fundamentos de Producción Audiovisual
    • Producción de Video para Plataformas Digitales
    • Producción de Audio y Podcast
    • Fotografía y Diseño Gráfico para Contenido Digital
    • Motion Graphics y Animación
    • Contenido Interactivo y Realidad Aumentada
    • Estrategia, Marketing y Monetización de Contenidos
  • Desarrollo Móvil
    • Fundamentos de Desarrollo Móvil
    • Desarrollo Nativo Android con Kotlin
    • Desarrollo Nativo iOS con Swift
    • Desarrollo Multiplataforma con React Native
    • Desarrollo Multiplataforma con Flutter
    • Arquitectura y Patrones de Diseño Móvil
    • Integración de APIs y Persistencia Móvil
    • Testing y Despliegue en Móvil
    • Diseño UX/UI para Móviles
  • Diseño Gráfico y Arte Digital
    • Fundamentos del Diseño Gráfico y Digital
    • Diseño de Identidad Visual y Branding
    • Ilustración Digital y Arte Conceptual
    • Diseño Editorial y de Empaques
    • Motion Graphics y Animación 3D
    • Diseño Gráfico Asistido por Inteligencia Artificial
    • Creatividad e Innovación en Diseño
  • Programación
    • Fundamentos de Programación e Ingeniería de Software
    • Herramientas de IA para el trabajo
    • Matemáticas para Programación
    • Programación con Python
    • Programación con JavaScript
    • Programación con TypeScript
    • Programación Orientada a Objetos con Java
    • Desarrollo con C# y .NET
    • Programación con PHP
    • Programación con Go y Rust
    • Programación Móvil con Swift y Kotlin
    • Programación con C y C++
    • Administración Básica de Servidores Linux
  • Negocios
    • Fundamentos de Negocios y Emprendimiento
    • Estrategia y Crecimiento Empresarial
    • Finanzas Personales y Corporativas
    • Inversión en Mercados Financieros
    • Ventas, CRM y Experiencia del Cliente
    • Operaciones, Logística y E-commerce
    • Gestión de Proyectos y Metodologías Ágiles
    • Aspectos Legales y Cumplimiento
    • Habilidades Directivas y Crecimiento Profesional
    • Diversidad e Inclusión en el Entorno Laboral
    • Herramientas Digitales y Automatización para Negocios
  • Blockchain y Web3
    • Fundamentos de Blockchain y Web3
    • Desarrollo de Smart Contracts y dApps
    • Finanzas Descentralizadas (DeFi)
    • NFTs y Economía de Creadores
    • Seguridad Blockchain
    • Ecosistemas Blockchain Alternativos (No-EVM)
    • Producto, Marketing y Legal en Web3
  • Recursos Humanos
    • Fundamentos y Cultura Organizacional en RRHH
    • Atracción y Selección de Talento
    • Cultura y Employee Experience
    • Gestión y Desarrollo de Talento
    • Desarrollo y Evaluación de Liderazgo
    • Diversidad, Equidad e Inclusión
    • AI y Automatización en Recursos Humanos
    • Tecnología y Automatización en RRHH
  • Finanzas e Inversiones
    • Fundamentos de Finanzas Personales y Corporativas
    • Análisis y Valoración Financiera
    • Inversión y Mercados de Capitales
    • Finanzas Descentralizadas (DeFi) y Criptoactivos
    • Finanzas y Estrategia para Startups
    • Inteligencia Artificial Aplicada a Finanzas
    • Domina Excel
    • Financial Analyst
    • Conseguir trabajo en Finanzas e Inversiones
  • Startups
    • Fundamentos y Validación de Ideas
    • Estrategia de Negocio y Product-Market Fit
    • Desarrollo de Producto y Operaciones Lean
    • Finanzas, Legal y Fundraising
    • Marketing, Ventas y Growth para Startups
    • Cultura, Talento y Liderazgo
    • Finanzas y Operaciones en Ecommerce
    • Startups Web3 y Blockchain
    • Startups con Impacto Social
    • Expansión y Ecosistema Startup
  • Cloud Computing y DevOps
    • Fundamentos de Cloud y DevOps
    • Administración de Servidores Linux
    • Contenerización y Orquestación
    • Infraestructura como Código (IaC) y CI/CD
    • Amazon Web Services
    • Microsoft Azure
    • Serverless y Observabilidad
    • Certificaciones Cloud (Preparación)
    • Plataforma Cloud GCP

Platzi y comunidad

  • Platzi Business
  • Live Classes
  • Lanzamientos
  • Executive Program
  • Trabaja con nosotros
  • Podcast

Recursos

  • Manual de Marca

Soporte

  • Preguntas Frecuentes
  • Contáctanos

Legal

  • Términos y Condiciones
  • Privacidad
  • Tyc promociones
Reconocimientos
Reconocimientos
Logo reconocimientoTop 40 Mejores EdTech del mundo · 2024
Logo reconocimientoPrimera Startup Latina admitida en YC · 2014
Logo reconocimientoPrimera Startup EdTech · 2018
Logo reconocimientoCEO Ganador Medalla por la Educación T4 & HP · 2024
Logo reconocimientoCEO Mejor Emprendedor del año · 2024
De LATAM conpara el mundo
YoutubeInstagramLinkedInTikTokFacebookX (Twitter)Threads