CI/CD và các loại Test trong kiểm thử phần mềm

Việc áp dụng cd/ci trong Django giúp cho quá trình phát triển ứng dụng web trở nên hiệu quả và nhanh chóng hơn, đảm bảo rằng ứng dụng luôn được cập nhật và chạy ổn định trên môi trường sản phẩm.
cicd-va-cac-loai-test-trong-kiem-thu-phan-mem

CI/CD - Continuous Integration / Continuous Delivery/Deployment

CI - Continuous Integration:

Thực hiện việc build, test chương trình mỗi khi repository bất kì sự thay đổi nào. Khi Dev thực hiện một thay đổi bất kì trong repo của chương trình, CI nhận được phản hồi và sẽ thực hiện build chương trình, chạy các chương trình test đã được viết sẵn như unit test hay integration test, sau đó sẽ gửi phản hồi kết quả về cho dev, nếu không thành công CI sẽ gửi feedback, nếu thành công thì sẽ đến giai đoạn tiếp theo là CD

CD - Continuous Delivery:

CD là quá trình sau khi đã thực hiện xong CI, CD thực hiện setup môi trường, đưa chương trình vào môi trường testing hay staging chạy hàng loạt các loại test với chương trình như: UI testing, Load Testing, Integration testing, API testing... Và cuối cùng đưa ra kết quả là Failed or Passed để Dev có thể thực hiện sửa đổi hay cải thiện chương trình. Continuous Delivery được thực hiện bằng cách sử dụng Deployment Pipeline, nó chia chương trình ra rất nhiều giai đoạn để kiểm tra từng góc độ khác nhau xem mức ảnh hướng tới người dùng.

CD - Continuous Deployment:

Continuous Deployment cũng giống như Continuous Delivery nhưng thay vì đưa chương trình một cách thủ công vào môi trường Testing hay Staging thì CD tự động đưa chương trình vào môi trường Production

Continuous Testing

CI/CD thực hiện rất nhiều lần test chương trình để đảm bảo chất lượng chương trình, sớm phát hiện ra lỗi để khắc phục. Các loại test phổ biến CI/CD:

  • Unit testing

  • Integration testing

  • Regression testing

Quy trình thực thi của CI/CD:

  • CI theo dõi bất kì thay đổi nào của repository, nếu có sự thay đổi, CI sẽ thực hiện build và test qua chương trình với các bộ test được cài đặt sẵn. Qua lần test của CI nếu thành công chương trình sẽ được chuyển đến bước CD, nếu không CI sẽ gửi feedback cho Dev.
  • CD thực hiện setup môi trường, đưa chương trình vào môi trường để deploy mà thực hiện hàng loạt lượt kiểm thử, nếu chương trình vượt qua tất cả, chương trình sẽ sẵn sàng để release và CD thông báo passed, nếu không sẽ failed.
  • Dev dựa vào kết quả nhận được sau quá trình CI/CD để có thể tiếp tục việc xây dựng chương trình.

Lợi ích của CI/CD

  • Hạn chế tối đa lỗi xảy ra, sớm phát hiện lỗi để có phương án khắc phục.

  • CI/CD thực hiện rất nhiều khâu tự động hoá từ đó có thể giảm bớt thời gian và công sức cho Dev

  • Trải qua rất nhiều khâu kiểm thử, ràng buộc, do đó chất lượng sản phẩm sẽ được nâng cao

  • Sản phẩm có thể release bất cứ lúc nào

  • Tính bảo mật, an toàn được nâng cao qua các khâu kiểm thử

Yếu tố xây dựng một bộ CI/CD

  • Version Control Systems - VCS (Hệ thống kiểm soát phiên bản): CI sử dụng repo có VCS như Git, đảm bảo việc rollback phiên bản cũ nếu phiên bản hiện tại phát sinh lỗi

  • Build (Bộ dựng): CI thực hiện đóng gói các tệp tin và thành phần của chương trình để kiểm thử chất lượng, hiệu suất sản phẩm và các yêu cầu khác

  • Testing (Bộ kiểm thử): CI/CD thực hiện rất nhiều khâu kiểm thử, do đó bộ kiểm thử là không thể thiếu với CI/CD

  • Feedback and Approvals (Phản hồi và kiểm duyệt): Sau khi thực hiện kiểm thử qua CI và CD, cần có đánh giá và phản hồi lại cho Dev để có những phương hướng tiếp theo cho việc phát triển chương trình

  • Enviroments (Môi trường): CI/CD khi kiểm thử và triển khai cần có môi trường để thực nghiệm, các môi trường này có các tính chất, quy tắc bảo vệ riêng để đáp ứng yêu cầu về bảo mật


Types of Sofware Testing

  1. Unit Tests: Như tên gọi, phương pháp kiểm thử này chỉ kiểm tra các unit, chức năng, lớp nhỏ lẻ của chương trình, cũng vì vậy mà unit test rất nhanh và phù hợp với CI

  2. Integration Tests: Phương pháp này thực hiện việc kiểm tra các module, dịch vụ có hoạt động tốt với nhau hay không, ví dụ kiểm tra database, dịch vụ thanh toán online có hoạt động tốt với chương trình hay không. Loại kiểm tra này yêu cầu nhiều thành phần độc lập được thiết lập và khởi chạy

  3. Functional Tests: Đây là cách kiểm tra nhắm vào mục tiêu của khách hàng với sản phẩm, mục tiêu của Functional test là output đầu ra có thoả hay không mà không cần quan tâm đến luồng hoạt động của chương trình

  4. End-To-End Tests: End-to-End test kiểm tra luồng hoạt động của chương trình có đúng như mong đợi hay không khi thực hiện các thao tác và chức năng của chương trình ví dụ như tải lại trang, đăng nhập ,... Hình thức test này rất hữu ích nhưng chỉ nên áp dụng với các chương trình có quy mô lớn và phức tạp, vì nó rất tốn kém và khó bảo trì

  5. Acceptance Testing: Là hình thức test mà khách hàng là người sử dụng sản phẩm để kiểm tra chương trình có hoạt động như ý của khách hàng hay không

  6. Performance Testing: Kiểm tra hiệu suất của sản phẩm với khối lượng công việc lớn, ví dụ lượng reqest lớn vào một trang web, mục đích là để kiểm tra hiệu năng của hệ thống xem hệ thống có thể xử lý như tới mức nào.

  7. System Testing: Kiểm tra xem chương trình có thể chạy tốt dưới nhiều hệ điều hành khác nhau hay không.

  8. Regression Testing: Là phương pháp kiểm thử đảm bảo rằng khi có sự thay đổi các hàm, chức năng trong chương trình, chương trình vẫn hoạt động ổn định.


Example with Unittest

image

image

Yêu cầu:

image

Thực hiện viết hàm tìm kiếm sử dụng đệ quy:

# Fill the Python code in this file
from test_data import *


def json_search(key, input_object):
    ret_val = []
    if isinstance(input_object, dict): 
        for k, v in input_object.items(): 
            if k == key:
                temp = {k: v}
                ret_val.append(temp)
            if isinstance(v, dict):  
                ret_val.extend(json_search(key, v))
            elif isinstance(v, list): 
                for item in v:
                    if not isinstance(item, (str, int)):  
                        ret_val.extend(json_search(key, item))
                    else:
                        for val in input_object:
                            if not isinstance(val, (str, int)):
                                ret_val.extend(json_search(key, val))
    return ret_val


print(json_search("issueSummary", data))

Viết chương trình hàm main chạy theo yêu cầu:

# Fill the Python code in this file
import unittest
from recursive_json_search import *
from test_data import *


class json_search_test(unittest.TestCase):
    def test_search_found(self):
        self.assertTrue([] != json_search(key1, data))

    def test_search_not_found(self):
        self.assertTrue([] == json_search(key2, data))

    def test_is_a_list(self):
        self.assertIsInstance(json_search(key1, data), list)


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

Kết quả:

image

7 phút đọc·1,159 lượt xem·