Thursday 27 January 2022

C++ workflow đơn giản với Makefile và Bash script

Vẫn tiếp tục là C++ CI/CD, nhưng lần này ta không dùng đồ của MS (aka không dùng Visual Studio để có file solution > không xài được workflow MSBuild). Hướng tiếp cận lần này sẽ dùng Makefile để  chạy compile + test command, sử dụng Bash script để "giả lập" một test framework.

Bài viết trước

Để bắt đầu, mình sẽ sử dụng repository demo: https://github.com/trhgquan/GPA-OOP. Project này mình chỉ sử dụng command-line arguments, output ra stdout. Mục tiêu của quá trình kiểm thử: đảm bảo software không crash, handle được các arguments đã được định nghĩa.

Cấu trúc repository sẽ như thế này:


Bỏ qua các thư mục data, example. Thư mục src chứa mã nguồn project; thư mục tests chưa dữ liệu và test driver

Bắt đầu nào:

1. Makefile

a. Compile

Mình sẽ compile tất cả các file trong thư mục src ra object files, sau đó link lại với nhau thành executable. Đoạn này bạn tham khảo trong file Makefile:



  • Dòng 1, 2 định nghĩa trình biên dịch và các flags lúc compile. Trình biên dịch mình dùng là g++.
  • Dòng 4, 5,6 ,7 định nghĩa các biến thư mục lưu mã nguồn và thư mục lưu object files. Thư mục lưu mã nguồn là src, lưu object files là obj.
  • Dòng 11, 12 định nghĩa các bước cần làm để link các object files lại thành file thực thi có tên main.
  • Dòng 14, 15, 16 định nghĩa các bước cần làm để compile một file .cpp ra file .o. Chú ý dòng 15 sẽ tạo mới thư mục obj nếu chưa có, sau đó compile file .cpp thành file .o và bỏ vào thư mục obj.

b. Test

Quy trình test như sau:

  1. Copy file thực thi vào thư mục tests
  2. Test driver sẽ gọi file thực thi với dữ liệu trong thư mục tests/data
  3. Test driver kiểm tra kết quả trả ra với kết quả định sẵn trong tests/output.

Trong Makefile mình có định nghĩa các luật init_test và test, cụ thể như sau:

  • init_test: copy file thực thi vào thư muc tests
  • test: cd đến thư mục test và chạy test driver test.sh.

c. Clean

Luật clean để xóa các file object và file thực thi, làm vậy để khỏi commit nhầm lên git. Đọc dòng 18, 19 chắc các bạn hiểu mà :/

2. Bash script

Cấu trúc bash script của mình như trong file test.sh:


  • test_seeds là các command-line arguments để test. Index i của test_seeds tương ứng với một file .out trong thư mục output.
  • Với mỗi command-line, so sánh stdout với file .out. Nếu trùng khớp thì output test passed, ngược lại output test failed.

Mình chỉ thêm thắt màu mè cho đẹp :/

Khi chạy test sẽ ra kết quả như sau:


3. Workflow

Bạn có thể xài em này:

Hoặc config một workflow như sau.


Nói chung là vì bạn đã xài Makefile, nên command cũng gọn nhẹ hơn nhiều á!

Kết

Vì đây là workflow đơn giản, chủ yếu các bạn nên dùng cho feature test. Với unit test cũng sử dụng makefile, mời bạn tham khảo video này.

Happy coding!

No comments:

Post a Comment

Popular posts