Skip to content

15. Ćwiczenie praktyczne – wersja 7

Image

15.1. Implémentation

W tym miejscu powrócimy do wersji 6, przenosząc stałe używane w głównych skryptach do pliku konfiguracyjnego. Plik konfiguracyjny będzie nosił nazwę jSON, a jego zawartość będzie następująca:


{
    "rootDirectory": "C:/Data/st-2019/dev/php7/poly/scripts-console/impots/version-07",
    "databaseFilename": "Data/database.json",
    "taxAdminDataFileName": "Data/taxadmindata.json",
    "taxPayersDataFileName": "Data/taxpayersdata.json",
    "resultsFileName": "Data/results.json",
    "errorsFileName": "Data/errors.json",
    "dependencies": {
        "BaseEntity": "/../version-05/Entities/BaseEntity.php",
        "TaxAdminData": "/../version-05/Entities/TaxAdminData.php",
        "TaxPayerData": "/../version-05/Entities/TaxPayerData.php",
        "Database": "/../version-05/Entities/Database.php",
        "ExceptionImpots": "/../version-05/Entities/ExceptionImpots.php",
        "Utilitaires": "/../version-05/Utilities/Utilitaires.php",
        "InterfaceDao": "/../version-05/Dao/InterfaceDao.php",
        "TraitDao": "/../version-05/Dao/TraitDao.php",
        "InterfaceDao4TransferAdminData2Database": "/../version-05/Dao/InterfaceDao4TransferAdminData2Database.php",
        "DaoTransferAdminDataFromJsonFile2Database": "/../version-05/Dao/DaoTransferAdminDataFromJsonFile2Database.php",        
        "DaoImpotsWithTaxAdminDataInDatabase": "/../version-05/Dao/DaoImpotsWithTaxAdminDataInDatabase.php",
        "InterfaceMetier": "/../version-05/Métier/InterfaceMetier.php",
        "Metier": "/../version-05/Métier/Metier.php"
    },
    "dependencies4calculate": [
        "BaseEntity",
        "TaxAdminData",
        "TaxPayerData",
        "Database",
        "ExceptionImpots",
        "Utilitaires",
        "InterfaceDao",
        "TraitDao",
        "DaoImpotsWithTaxAdminDataInDatabase",
        "InterfaceMetier",
        "Metier"],
    "dependencies4transfer": [
        "BaseEntity",
        "TaxAdminData",
        "Database",
        "ExceptionImpots",
        "Utilitaires",
        "InterfaceDao",
        "TraitDao",  
        "InterfaceDao4TransferAdminData2Database",
        "DaoTransferAdminDataFromJsonFile2Database"]
}

W tej konfiguracji:

  • wiersz 2: folder, względem którego mierzone są wszystkie ścieżki w tym pliku konfiguracyjnym;
  • wiersze 3–7: ścieżki do wszystkich plików jSON aplikacji;
  • wiersze 8–22: ścieżki do wszystkich plików aplikacji w formacie [clé=>chemin];
  • wiersze 23–34: zależności potrzebne do obliczenia podatku w postaci listy kluczy ze słownika [dependencies] (wiersze 8–22);
  • wiersze 35–44: zależności dotyczące przeniesienia do bazy danych plików jSON i [taxadmindata.json] w postaci listy kluczy ze słownika [dependencies] (wiersze 8–22);

Skrypt do przenoszenia danych do bazy danych administracji podatkowej [MainTransferAdminDataFromFile2PostgresSQLDatabase.php] przyjmuje następującą postać:


<?php

// ścisłe przestrzeganie zadeklarowanych typów parametrów funkcji
declare (strict_types=1);

// przestrzeń nazw
namespace Application;

// obsługa błędów przez PHP
// ini_set("display_errors", "0");
//
// ścieżka do pliku konfiguracyjnego
define("CONFIG_FILENAME", "../Data/config.json");

// pobieramy konfigurację
$config = \json_decode(\file_get_contents(CONFIG_FILENAME), true);

// dołączamy zależności niezbędne dla skryptu
$rootDirectory = $config["rootDirectory"];
foreach ($config["dependencies4transfer"] as $dependency) {
  require $rootDirectory . $config["dependencies"][$dependency];
}

// definicja stałych
define("DATABASE_CONFIG_FILENAME", "$rootDirectory/{$config["databaseFilename"]}");
define("TAXADMINDATA_FILENAME", "$rootDirectory/{$config["taxAdminDataFileName"]}");

//
try {
  // tworzenie warstwy [dao]
  $dao = new DaoTransferAdminDataFromJsonFile2Database(DATABASE_CONFIG_FILENAME, TAXADMINDATA_FILENAME);
  // przenoszenie danych do bazy
  $dao->transferAdminData2Database();
} catch (ExceptionImpots $ex) {
  // wyświetlanie błędu
  print $ex->getMessage() . "\n";
}
// koniec
print "Terminé\n";
exit;

Komentarze

Kod pozostaje taki sam jak w akapicie z linkiem. Jedyną różnicą jest wykorzystanie pliku [config.json] zamiast stałych w wierszach 18–26;

  • wiersz 16: funkcja [file_get_contents] przekształca plik [config.json] w ciąg znaków. Następnie funkcja [json_decode] wykorzystuje ten ciąg do utworzenia słownika [$config]. Drugi parametr [true] funkcji [json_decode] wskazuje, że zamierzamy utworzyć słownik;
  • wiersze 19–22: dołączamy zależności niezbędne dla skryptu przenoszącego dane z pliku [taxadmindata.json] do bazy danych;
    • [$config["dependencies4transfer"]] to tablica zależności niezbędnych dla skryptu transferu. Jest to lista kluczy. Ścieżki do plików, które należy dołączyć do projektu, znajdują się w słowniku [$config["dependencies"]];
    • $config["rootDirectory"] oznacza ścieżkę, którą należy poprzedzić nazwy plików przeznaczonych do włączenia;

Analogicznie skrypt do obliczania podatku przyjmuje następującą postać: [MainCalculateImpotsWithTaxAdminDataInPostgresDatabase]:


<?php

// ścisłe przestrzeganie zadeklarowanych typów parametrów funkcji
declare (strict_types=1);

// przestrzeń nazw
namespace Application;

// obsługa błędów przez PHP
// ini_set("display_errors", "0");
//
// ścieżka do pliku konfiguracyjnego
define("CONFIG_FILENAME", "../Data/config.json");

// pobieramy konfigurację
$config = \json_decode(\file_get_contents(CONFIG_FILENAME), true);

// dołączamy zależności niezbędne dla skryptu
$rootDirectory = $config["rootDirectory"];
foreach ($config["dependencies4calculate"] as $dependency) {
  require $rootDirectory . $config["dependencies"][$dependency];
}

// definicja stałych
define("DATABASE_CONFIG_FILENAME", "$rootDirectory/{$config["databaseFilename"]}");
define("TAXPAYERSDATA_FILENAME", "$rootDirectory/{$config["taxPayersDataFileName"]}");
define("RESULTS_FILENAME", "$rootDirectory/{$config["resultsFileName"]}");
define("ERRORS_FILENAME", "$rootDirectory/{$config["errorsFileName"]}");

//
try {
  // tworzenie warstwy [dao]
  $dao = new DaoImpotsWithTaxAdminDataInDatabase(DATABASE_CONFIG_FILENAME);
  // tworzenie warstwy [métier]
  $métier = new Metier($dao);
  // obliczanie podatku w trybie wsadowym
  $métier->executeBatchImpots(TAXPAYERSDATA_FILENAME, RESULTS_FILENAME, ERRORS_FILENAME);
} catch (ExceptionImpots $ex) {
  // wyświetlenie błędu
  print "Une erreur s'est produite : " . utf8_encode($ex->getMessage()) . "\n";
}
// koniec
print "Terminé\n";
exit;

15.2. Testy [Codeception]

Ta wersja, podobnie jak poprzednie, została zweryfikowana za pomocą testów [Codeception].

Image

15.2.1. Test warstwy [dao]

Test [DaoTest.php] wygląda następująco:


<?php

// ścisłe przestrzeganie zadeklarowanych typów parametrów funkcji
declare (strict_types=1);

// przestrzeń nazw
namespace Application;

// definicja stałych
define("ROOT", "C:/Data/st-2019/dev/php7/poly/scripts-console/impots/version-07");
// ścieżka do pliku konfiguracyjnego
define("CONFIG_FILENAME", ROOT."/Data/config.json");
// pobieranie konfiguracji
$config = \json_decode(\file_get_contents(CONFIG_FILENAME), true);
// dołączamy zależności niezbędne dla skryptu
$rootDirectory = $config["rootDirectory"];
foreach ($config["dependencies4calculate"] as $dependency) {
  require $rootDirectory . $config["dependencies"][$dependency];
}
// inne stałe
define("DATABASE_CONFIG_FILENAME", "$rootDirectory/{$config["databaseFilename"]}");

// test -----------------------------------------------------

class DaoTest extends \Codeception\Test\Unit {
  // TaxAdminData
  private $taxAdminData;

  public function __construct() {
    parent::__construct();
    // utworzenie warstwy [dao]
    $dao = new DaoImpotsWithTaxAdminDataInDatabase(DATABASE_CONFIG_FILENAME);
    $this->taxAdminData = $dao->getTaxAdminData();
  }

  // testy
  public function testTaxAdminData() {

  }

}

Komentarze

  • wiersze 9–21: definicja środowiska testowego. Używamy tego samego środowiska, bez warstwy [métier], co w głównym skrypcie [MainCalculateImpotsWithTaxAdminDataInPostgresDatabase] opisanym w akapicie „link”;
  • wiersze 29–34: tworzenie warstwy [dao];
  • wiersz 33: atrybut [$this→taxAdminData] zawiera dane do przetestowania;
  • wiersze 37–39: metoda [testTaxAdminData] jest tą opisaną w akapicie „link”;

Wyniki testu są następujące:

Image

15.2.2. Test warstwy [métier]

Test [MetierTest.php] wygląda następująco:


<?php

// ścisłe przestrzeganie zadeklarowanych typów parametrów funkcji
declare (strict_types=1);

// przestrzeń nazw
namespace Application;

// definicja stałych
define("ROOT", "C:/Data/st-2019/dev/php7/poly/scripts-console/impots/version-07");
// ścieżka do pliku konfiguracyjnego
define("CONFIG_FILENAME", ROOT . "/Data/config.json");
// pobieranie konfiguracji
$config = \json_decode(\file_get_contents(CONFIG_FILENAME), true);
// dołączamy zależności niezbędne dla skryptu
$rootDirectory = $config["rootDirectory"];
foreach ($config["dependencies4calculate"] as $dependency) {
  require $rootDirectory . $config["dependencies"][$dependency];
}
// inne stałe
define("DATABASE_CONFIG_FILENAME", "$rootDirectory/{$config["databaseFilename"]}");

// klasa testowa
class MetierTest extends \Codeception\Test\Unit {
  // warstwa biznesowa
  private $métier;

  public function __construct() {
    parent::__construct();
    // tworzenie warstwy [dao]
    $dao = new DaoImpotsWithTaxAdminDataInDatabase(DATABASE_CONFIG_FILENAME);
    // tworzenie warstwy [métier]
    $this->métier = new Metier($dao);
  }

  // testy
  public function test1() {

  }

  -----------------------------------

  public function test11() {

  }

}

Komentarze

  • wiersze 9–21: definicja środowiska testowego. Wykorzystujemy to samo środowisko, co w głównym skrypcie [MainCalculateImpotsWithTaxAdminDataInPostgresDatabase] opisanym w akapicie „link”;
  • wiersze 28–34: tworzenie warstwy [dao];
  • wiersz 33: atrybut [$this→métier] stanowi odwołanie do warstwy [métier], która ma zostać przetestowana;
  • wiersze 37–45: metody [test1, test2…, test11] są opisane w akapicie „link”;

Wyniki testu są następujące:

Image