Forum Testowania i AutomatyzacjiKategoria: BugProblem z uruchomieniem testsuite przez konsole w pytest
AvatarŁukasz Błaszkowski zapytał 5 lat temu

Witam,
mam problem z uruchomieniem testsuite przez konsole. Wyskakuje mi takie komunikat:

View post on imgur.com


Chce wygenerowanie raport przez Allure-2.6.0 a tylko przez konsole można. A jak puszczam testsuite przez PyCharma, to jest ok. Nie kuma tego.
Tu jest aktualne repo:
https://github.com/lblaszkowski/MercuryTours_WSB/commits/master
 
Z góry dziękuje za pomoc
Pozdrawiam

2 odpowiedzi
Best Answer
Krzysiek KijasKrzysiek Kijas Personel odpowiedział 5 lat temu

Hej,
Problem ten bierze się z dwóch rzeczy – miejsca z którego uruchamiane są testy oraz ścieżki podanej do plików .csv. W obu przypadkach kluczową rolę odgrywa current working directory, czyli aktualny katalog roboczy, który jest uwzględniany w skryptach i ścieżkach.
Do podejrzenia wartości current working directory można użyć:

import os
print('current working directory', os.getcwd())

Wystarczy umieścić to w dowolnym skrypcie, np. w testsuite.py:

if __name__ == '__main__':
    import os
    print('current working directory', os.getcwd())
    runner = unittest.TextTestRunner(verbosity=2)
    runner.run(full_suite())

Jeśli uruchamiasz testy zawarte w testsuite.py używając do tego PyCharma, to Twój current working directory będzie znajdował się w MercuryTours_WSB\PageObjectModel\TestSuite. Natomiast przy uruchomieniu testów z konsoli (bazując na screenie), current working directory to będzie MercuryTours_WSB. Wszystkie sćieżki do plików .scv były ustawiane właśnie z uwzgldnieniem tego katalogu.
Istnieje kilka opcji. Jedną z nich jest ręcznie ustawienie current working directory na miejsce, gdzie znajduje się plik testsuite.py. Można to zrobić za pomocą:

import os
os.chdir(os.path.dirname(__file__))
print(os.getcwd())

A w całości (zwróć uwagę, że zmiana ścieżki musi nastąpić przed importem modułów z testami):

import unittest
import os
os.chdir(os.path.dirname(__file__))
print('current working directory', os.getcwd())

from PageObjectModel.Test.login import Login_Pages
from PageObjectModel.Test.plan_journey import Plan_Journey_Pages
from PageObjectModel.Test.registration import Registration_Pages
from PageObjectModel.Test.booking_flight import Booking_Flight_Pages

def full_suite():
    test_suite = unittest.TestSuite()
    test_suite.addTest(unittest.makeSuite(Plan_Journey_Pages))
    test_suite.addTest(unittest.makeSuite(Login_Pages))
    test_suite.addTest(unittest.makeSuite(Registration_Pages))
    test_suite.addTest(unittest.makeSuite(Booking_Flight_Pages))
    return test_suite

if __name__ == '__main__':
    runner = unittest.TextTestRunner(verbosity=2)
    runner.run(full_suite())

Inną opcją jest parametryzacja wszystkich dekoratorów @data i uwzględnienie informacji o ścieżce danej klasy testowej w ścieżce do zestawu danych do ddt. Przykładowo:

# _*_ coding: utf-8 _*_
import unittest
from PageObjectModel.Pages.loginPage import LoginPages
from PageObjectModel.Application.application import Application_page
from PageObjectModel.Data_test.Function_for_downloading_test_data.test_data_loader import get_data
from ddt import ddt, data, unpack
from time import sleep
import os


@ddt
class Login_Pages(unittest.TestCase):
    file_path = os.path.dirname(__file__)
    csv_path = "../Data_test/Data_test_pages/Data_test_login/data_test_login.csv"
    data_path = os.path.join(file_path, csv_path)

    @classmethod
    def setUp(self):
        self.app = Application_page()

    @classmethod
    def tearDown(self):
        self.app.destroy()

    @data(*get_data(data_path))
    @unpack
    def test_login(self, valid_email, valid_password):
        driver = self.app.driver
        login = LoginPages(driver)
        login.click_signOnbutton()
        login.enter_username(valid_email)
        login.enter_password(valid_password)
        login.click_login()
        sleep(3)
        print(login.verification_page())

if __name__ == '__main__':
     unittest.main()

Najpierw definiujemy data_path, która zawiera informacje o miejscu, gdzie znajduje się plik (czyli login.py), a następnie do niej doklejana jest informacja o położeniu danych .csv. W tym przypadku trzeba zaznaczyć, że csv_path wskazuje na plik .csv “patrząc” od miejsca gdzie znajduje się dany plik z klasą testową.
Pozdrawiam,
K

Krzysiek KijasKrzysiek Kijas Personel odpowiedział 5 lat temu

Hej,
Załączony błąd spowodowany jest faktem, że w application.py także jest ścieżka względna do Drivera. Aczkolwiek z drugim sposobem też wszystko powinno działać, gdyż tam nie ustawia się current working directory, a jedynie modyfikuje się ścieżki w testach do @data.

Przy modyfikacji current working directory trzeba mieć na uwadze potrzebę poprawy wszystkich obecnych ścieżek względnych w projekcie 🙂

PS. jesli odpowiedź jest satysfakcjonująca to zamknąć 😀

AvatarŁukasz Błaszkowski odpowiedział 5 lat temu

ps. ja wybrałem opcję pierwszą.
Ps. mam zamknąć ten wątek ?

AvatarŁukasz Błaszkowski odpowiedział 5 lat temu

Pierwszy sposób:

import unittest
import os
os.chdir(os.path.dirname(__file__))
print(‘current working directory’, os.getcwd())

from PageObjectModel.Test.login import Login_Pages
from PageObjectModel.Test.plan_journey import Plan_Journey_Pages
from PageObjectModel.Test.registration import Registration_Pages
from PageObjectModel.Test.booking_flight import Booking_Flight_Pages

def full_suite():
test_suite = unittest.TestSuite()
test_suite.addTest(unittest.makeSuite(Plan_Journey_Pages))
test_suite.addTest(unittest.makeSuite(Login_Pages))
test_suite.addTest(unittest.makeSuite(Registration_Pages))
test_suite.addTest(unittest.makeSuite(Booking_Flight_Pages))
return test_suite

if __name__ == ‘__main__’:
runner = unittest.TextTestRunner(verbosity=2)
runner.run(full_suite())

Działa bez zarzutów. Druga opcja już nie działa. W konsoli wyskakuje takie komunikaty

http://wyslijto.tk/download/9kn3ebumwizof68v0ba87waee
Komunikaty są duże i dlatego są w pliku.txt

tu jest aktualne repo:

https://github.com/lblaszkowski/MercuryTours_WSB/tree/e6caa452ddb61c5c058b6857dd5f2e468f7c9010

testy robiłem na login.py z opcja druga

AvatarŁukasz Błaszkowski odpowiedział 5 lat temu

Ok. . Drugim sposobem nadal nie działa, ale pierwszy sposób już tak.Pierwszy sposób będę używała w testach