Tôi đang nghiên cứu định tuyến tái cấu trúc Symfony 2. 8 dự án một tháng trước. Bài kiểm tra định tuyến chúng tôi chỉ có thể đếm các tuyến đường. Đó là nó
Điều đó giống như giả sử lò phản ứng hạt nhân hoạt động vì không có đám cháy nào ở ngôi làng cách đó 5 dặm
Chúng tôi cần một thử nghiệm tốt hơn bao gồm tải mọi tuyến đường, đường dẫn, tiền tố và mọi thứ mà
use Nette\Utils\Json;
$routeMapJson = Json::encode[$routeMap, Json::PRETTY];
4 có thể chứa. Đây là một ý tưởng thô 10 dòngTôi đang tái cấu trúc cấu hình ~80 tuyến từ YAML sang PHP, nhưng cần chúng hoạt động 😊
– Tomas Votruba 🇺🇦 [@VotrubaT] ngày 27 tháng 4 năm 2022
Làm cách nào để bạn kiểm tra xem tất cả các tuyến vẫn giống nhau trong #symfony?
This is my go ↓ pic.twitter.com/hdqLDAEk3v
Một tháng sau
Chúng tôi vẫn có thử nghiệm này đang hoạt động tốt. cho đến nay nó
- đã phát hiện ra 5 lỗi trong kiểm tra CI theo yêu cầu kéo
- đã giúp chúng tôi tìm ra 1 tuyến đường chết
Đó là lý do tại sao tôi muốn chia sẻ nó với bạn, từng bước một. Cái hay của nó là bạn có thể viết bài kiểm tra này trong 10 phút và không tốn chi phí bảo trì. Bạn có thể sử dụng phương pháp này không chỉ cho định tuyến Symfony mà còn cho các thực thể được tải hoặc bất kỳ thứ gì ở dạng mảng. Phản hồi của CI rằng mọi thứ vẫn hoạt động là vô giá
1. Nhận các tuyến đã tải từ Symfony
Bước đầu tiên mà chúng ta phải làm là lấy tất cả các tuyến đã tải. Để làm được điều đó, chúng ta cần một
use Nette\Utils\Json;
$routeMapJson = Json::encode[$routeMap, Json::PRETTY];
5. Chúng ta sẽ xem xét cách lấy dữ liệu được định tuyến chuẩn hóa. Sau đó, chúng tôi sẽ đặt mọi thứ lại với nhau trong một trường hợp thử nghiệm/** @var \Symfony\Component\Routing\RouterInterface $router */
$routeCollection = $router->getRouteCollection[];
// here we collect route data to an array
$routeMap = [];
foreach [$routeCollection->all[] as $name => $route] {
// we wanted to test only attributes we use, but you can name all of them
$routeMap[$name] = [
'path' => $route->getPath[],
'requirements' => $route->getRequirements[],
'defaults' => $route->getDefaults[],
'methods' => $route->getMethods[],
];
}
// sort A → Z for nice standardized output
ksort[$routeMap];
Bạn có thể thử điều này một cách nhanh chóng trong bộ điều khiển hoặc lệnh.
use Nette\Utils\Json;
$routeMapJson = Json::encode[$routeMap, Json::PRETTY];
6 để xem bạn đã thu thập các tuyến đường chưađược rồi. Chúng tôi có dữ liệu về các tuyến đường mà dự án của chúng tôi hiện có. Làm thế nào để chúng ta biến nó thành một thử nghiệm chứng minh trong tương lai để tránh sự cố lõi hạt nhân?
2. Ảnh chụp liên tục vào tệp
Thử nghiệm sau đây đôi khi được gọi là "ảnh chụp nhanh" và rất hữu ích để thử nghiệm kết quả đầu ra HTML. Chúng tôi có dữ liệu trong một
use Nette\Utils\Json;
$routeMapJson = Json::encode[$routeMap, Json::PRETTY];
0 với các chuỗi. Làm cách nào để chúng tôi biến nó thành ảnh chụp nhanh được lưu trữ trong một tệp?Chà, ngay cả bài kiểm tra phức tạp hơn như I/O của Hiệu trưởng cũng có thể được chuyển thành ảnh chụp nhanh
Chúng tôi có thể xử lý một
use Nette\Utils\Json;
$routeMapJson = Json::encode[$routeMap, Json::PRETTY];
0, phải không? use Nette\Utils\Json;
$routeMapJson = Json::encode[$routeMap, Json::PRETTY];
Chuỗi là gì, có thể được lưu vào tệp
file_put_contents[__DIR__ . '/Fixture/expected_route_map.json', $routeMapJson];
Bây giờ chúng tôi có ảnh chụp nhanh các tuyến đường của mình trong một tệp JSON. Không chỉ là dòng dài, mà là tệp JSON được thụt lề đẹp mắt. Chúng ta có thể mở nó và tự đi qua nó. Các tuyến bao gồm tiền tố, YAML, XML, chú thích và tuyến thuộc tính. Chúng tôi không quan tâm đến định dạng, chỉ cần cuối cùng mọi thứ ở cùng một vị trí
Nếu một tên tuyến đường được thay đổi chỉ bằng một ký tự, chúng tôi biết điều đó. Nếu một tuyến đường mới được thêm vào, chúng tôi biết điều đó
Bảo trì dễ dàng?
Nếu chúng tôi thêm một tuyến đường mới, chúng tôi biết điều đó. bài kiểm tra sẽ thất bại. Nhưng đó không phải là những gì chúng ta mong đợi. Chúng tôi đã thêm một tuyến đường mới, vì vậy chúng tôi muốn nó ở đó. Ồ, chúng ta sẽ phải cập nhật tệp
use Nette\Utils\Json;
$routeMapJson = Json::encode[$routeMap, Json::PRETTY];
2Nhưng bằng cách nào?
Đó là một sự lãng phí thời gian mà chúng tôi muốn sử dụng cho công việc có ý nghĩa hơn
Ở đây chúng ta sẽ tận dụng mẹo thử nghiệm mà tôi đã học được từ Nikita Popov khi tôi đang đóng góp trình phân tích cú pháp php. Không chỉ là niềm vui khi được đóng góp mà bạn còn có thể cập nhật các bài kiểm tra từ một dòng lệnh. Đúng vậy, không cần làm việc, không cần chỉnh sửa thủ công, chỉ cần chạy
use Nette\Utils\Json;
$routeMapJson = Json::encode[$routeMap, Json::PRETTY];
4________số 8Nó không thể đơn giản hơn. Để cập nhật lịch thi thử, hãy thêm
use Nette\Utils\Json;
$routeMapJson = Json::encode[$routeMap, Json::PRETTY];
5 trước khi chạy PHPUnituse Nette\Utils\Json;
$routeMapJson = Json::encode[$routeMap, Json::PRETTY];
0Cuối cùng use Nette\Utils\Json;
$routeMapJson = Json::encode[$routeMap, Json::PRETTY];
6
use Nette\Utils\Json;
$routeMapJson = Json::encode[$routeMap, Json::PRETTY];
Chúng tôi có các mảnh. bây giờ chúng ta chỉ cần đặt chúng lại với nhau
use Nette\Utils\Json;
$routeMapJson = Json::encode[$routeMap, Json::PRETTY];
2Hãy thêm thử nghiệm này và chạy nó. ồ, nó thất bại. Đầu tiên, chúng ta phải tạo tệp lịch thi đấu bằng thủ thuật nhỏ của mình
use Nette\Utils\Json;
$routeMapJson = Json::encode[$routeMap, Json::PRETTY];
0Đó là nó. Bây giờ bạn đang kiểm tra tất cả các tuyến đường của mình và bạn có thể chắc chắn rằng nhà máy điện hạt nhân vẫn an toàn