Skip to content

15. Практичне завдання — версія 7

Image

15.1. Implémentation

Тут ми повернемося до версії 6, винісши в окремий файл конфігурації константи, що використовуються в основних скриптах. Файл конфігурації матиме назву jSON, а його вміст буде таким:


{
    "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"]
}

У цій конфігурації:

  • рядок 2: папка, відносно якої вимірюються всі шляхи у цьому конфігураційному файлі;
  • рядки 3–7: шляхи до всіх файлів jSON додатка;
  • рядки 8–22: шляхи до всіх файлів додатка у форматі [clé=>chemin];
  • рядки 23–34: залежності для розрахунку податку у вигляді списку ключів словника [dependencies] (рядки 8–22);
  • рядки 35–44: залежності для перенесення до бази даних файлів jSON та [taxadmindata.json] у вигляді списку ключів словника [dependencies] (рядки 8–22);

Скрипт для перенесення даних податкової адміністрації [MainTransferAdminDataFromFile2PostgresSQLDatabase.php] має такий вигляд:


<?php

// суворе дотримання оголошених типів параметрів функцій
declare (strict_types=1);

// простір імен
namespace Application;

// обробка помилок за допомогою PHP
// ini_set("display_errors", "0");
//
// шлях до файлу конфігурації
define("CONFIG_FILENAME", "../Data/config.json");

// завантажуємо конфігурацію
$config = \json_decode(\file_get_contents(CONFIG_FILENAME), true);

// включення необхідних для скрипта залежностей
$rootDirectory = $config["rootDirectory"];
foreach ($config["dependencies4transfer"] as $dependency) {
  require $rootDirectory . $config["dependencies"][$dependency];
}

// визначення констант
define("DATABASE_CONFIG_FILENAME", "$rootDirectory/{$config["databaseFilename"]}");
define("TAXADMINDATA_FILENAME", "$rootDirectory/{$config["taxAdminDataFileName"]}");

//
try {
  // створення шару [dao]
  $dao = new DaoTransferAdminDataFromJsonFile2Database(DATABASE_CONFIG_FILENAME, TAXADMINDATA_FILENAME);
  // передача даних у базу
  $dao->transferAdminData2Database();
} catch (ExceptionImpots $ex) {
  // виводиться повідомлення про помилку
  print $ex->getMessage() . "\n";
}
// кінець
print "Terminé\n";
exit;

Коментарі

Код залишається таким самим, як у розділі «Посилання». Єдина відмінність полягає у використанні файлу [config.json] замість констант у рядках 18–26;

  • рядок 16: функція [file_get_contents] перетворює файл [config.json] у рядок символів. Потім функція [json_decode] використовує цей рядок для створення словника [$config]. Другий параметр [true] функції [json_decode] вказує на те, що потрібно створити словник;
  • рядки 19–22: додаються залежності, необхідні для скрипта перенесення даних із файлу [taxadmindata.json] до бази даних;
    • [$config["dependencies4transfer"]] — це масив залежностей, необхідних для скрипта перенесення. Це список ключів. Шляхи до файлів, які потрібно включити до проєкту, містяться у словнику [$config["dependencies"]];
    • $config["rootDirectory"] — це префікс, яким повинні починатися шляхи до файлів, що підлягають включенню;

Аналогічно, скрипт для розрахунку податку виглядає наступним чином: [MainCalculateImpotsWithTaxAdminDataInPostgresDatabase]:


<?php

// суворе дотримання оголошених типів параметрів функцій
declare (strict_types=1);

// простір імен
namespace Application;

// обробка помилок за допомогою PHP
// ini_set("display_errors", "0");
//
// шлях до файлу конфігурації
define("CONFIG_FILENAME", "../Data/config.json");

// завантажуємо конфігурацію
$config = \json_decode(\file_get_contents(CONFIG_FILENAME), true);

// включення необхідних для скрипта залежностей
$rootDirectory = $config["rootDirectory"];
foreach ($config["dependencies4calculate"] as $dependency) {
  require $rootDirectory . $config["dependencies"][$dependency];
}

// визначення констант
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 {
  // створення шару [dao]
  $dao = new DaoImpotsWithTaxAdminDataInDatabase(DATABASE_CONFIG_FILENAME);
  // створення шару [métier]
  $métier = new Metier($dao);
  // розрахунок податків у пакетному режимі
  $métier->executeBatchImpots(TAXPAYERSDATA_FILENAME, RESULTS_FILENAME, ERRORS_FILENAME);
} catch (ExceptionImpots $ex) {
  // виведення повідомлення про помилку
  print "Une erreur s'est produite : " . utf8_encode($ex->getMessage()) . "\n";
}
// кінець
print "Terminé\n";
exit;

15.2. Тестування [Codeception]

Ця версія, як і попередні, перевірена за допомогою тестів [Codeception].

Image

15.2.1. Тестування рівня [dao]

Тест [DaoTest.php] виглядає наступним чином:


<?php

// суворе дотримання оголошених типів параметрів функцій
declare (strict_types=1);

// простір імен
namespace Application;

// визначення констант
define("ROOT", "C:/Data/st-2019/dev/php7/poly/scripts-console/impots/version-07");
// шлях до файлу конфігурації
define("CONFIG_FILENAME", ROOT."/Data/config.json");
// отримання конфігурації
$config = \json_decode(\file_get_contents(CONFIG_FILENAME), true);
// включення необхідних для скрипта залежностей
$rootDirectory = $config["rootDirectory"];
foreach ($config["dependencies4calculate"] as $dependency) {
  require $rootDirectory . $config["dependencies"][$dependency];
}
// інші константи
define("DATABASE_CONFIG_FILENAME", "$rootDirectory/{$config["databaseFilename"]}");

// тест -----------------------------------------------------

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

  public function __construct() {
    parent::__construct();
    // створення шару [dao]
    $dao = new DaoImpotsWithTaxAdminDataInDatabase(DATABASE_CONFIG_FILENAME);
    $this->taxAdminData = $dao->getTaxAdminData();
  }

  // тести
  public function testTaxAdminData() {

  }

}

Коментарі

  • рядки 9–21: визначення середовища тесту. Ми використовуємо те саме середовище, що й у головному скрипті [MainCalculateImpotsWithTaxAdminDataInPostgresDatabase], описаному в розділі «посилання», але без шару [métier];
  • рядки 29–34: побудова шару [dao];
  • рядок 33: атрибут [$this→taxAdminData] містить дані, що підлягають тестуванню;
  • рядки 37–39: метод [testTaxAdminData] — це той, що описаний у розділі за посиланням;

Результати тесту такі:

Image

15.2.2. Тестування шару [métier]

Тест [MetierTest.php] виглядає так:


<?php

// суворе дотримання оголошених типів параметрів функцій
declare (strict_types=1);

// простір імен
namespace Application;

// визначення констант
define("ROOT", "C:/Data/st-2019/dev/php7/poly/scripts-console/impots/version-07");
// шлях до файлу конфігурації
define("CONFIG_FILENAME", ROOT . "/Data/config.json");
// отримання конфігурації
$config = \json_decode(\file_get_contents(CONFIG_FILENAME), true);
// включення необхідних для скрипта залежностей
$rootDirectory = $config["rootDirectory"];
foreach ($config["dependencies4calculate"] as $dependency) {
  require $rootDirectory . $config["dependencies"][$dependency];
}
// інші константи
define("DATABASE_CONFIG_FILENAME", "$rootDirectory/{$config["databaseFilename"]}");

// клас тестування
class MetierTest extends \Codeception\Test\Unit {
  // бізнес-шар
  private $métier;

  public function __construct() {
    parent::__construct();
    // створення шару [dao]
    $dao = new DaoImpotsWithTaxAdminDataInDatabase(DATABASE_CONFIG_FILENAME);
    // створення шару [métier]
    $this->métier = new Metier($dao);
  }

  // тести
  public function test1() {

  }

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

  public function test11() {

  }

}

Коментарі

  • рядки 9–21: визначення середовища тесту. Ми використовуємо те саме середовище, що й у головному скрипті [MainCalculateImpotsWithTaxAdminDataInPostgresDatabase], описаному в розділі «Посилання»;
  • рядки 28–34: побудова шару [dao];
  • рядок 33: атрибут [$this→métier] є посиланням на шар [métier], який потрібно протестувати;
  • рядки 37–45: методи [test1, test2…, test11] — це ті, що описані в розділі «Посилання»;

Результати тестування такі:

Image