Code Refactoring : Tại sao lại quan trọng đối với Software Tester

Thuật ngữ Code refactoring được sử dụng để chỉ ra việc dọn dẹp, thiết kế lại source code, đây là việc dành cho Developers. Trong bài giới thiệu này, chúng ta sẽ xem xét kỹ hơn kỹ thuật này và tầm quan trọng của nó. Những lợi ích liên quan đến việc tái cấu trúc mã là gì? Và quan trọng nhất là tại sao những người thử nghiệm cần phải biết về nó?

1. Code Refactoring là gì?

Về cơ bản, phần mềm thường không thành công khi nó trở nên quá phức tạp đến nỗi nó không thể cung cấp thêm các tính năng trong khi vẫn không có lỗi. Code Refactoring được sử dụng để cải thiện thiết kế mã để làm cho nó dễ dàng hơn để hiểu và mở rộng.

Đây là quá trình sửa đổi mã mà không thực sự sửa đổi chức năng của mã đó.

Nếu bạn tin rằng một tính năng có thể cần thiết trong tương lai và mã hiện tại của bạn sẽ không thể dễ dàng chứa nó, bạn hãy cấu trúc lại mã đó để dễ dàng thêm tính năng đó ngay bây giờ thay vì lo lắng về những gì bạn cần thay đổi bằng mã của mình để thêm tính năng này sau.

2. Tại sao cần phải tái cấu trúc?

Bằng cách di chuyển các đoạn code trùng lặp, bạn loại bỏ số lượng code và do đó code ít hơn, bạn có dễ dàng hơn là để sửa đổi cũng như để hiểu. Nếu bạn đã xem các chương trình lớn và cố gắng hiểu cách chúng hoạt động bằng cách viết mã dễ hiểu, bạn sẽ có thể dễ dàng sửa đổi code bằng cách sử dụng quy trình tái cấu trúc mã. Điều này sẽ cho phép bạn hiểu hệ thống tốt hơn.

Nếu bạn có thể đọc hiểu được code nếu bạn được cung cấp code của người khác. Bạn có thể nhìn vào đoạn code đó và không biết bất cứ điều gì đang diễn ra, nhưng nếu bạn tự đi vào và tái cấu trúc nó, bạn sẽ hoàn toàn hiểu được cách thức hoạt động của hệ thống. Bằng cách hiểu rõ hơn về hệ thống, sẽ dễ phát hiện lỗi hơn. Hơn nữa, nếu bạn đang viết code dễ hiểu, việc tái cấu trúc sẽ giúp bạn viết các đoạn code này nhanh hơn.

Việc thêm các tính năng trong mã nguồn thường mất rất nhiều thời gian và cố gắng sửa lỗi bằng cách quay lại lặp lại. Do đó, thay vì thêm các tính năng vào code của bạn, hãy thử quay lại và hiểu code tốt hơn để giúp bạn loại bỏ các lỗi. Không chỉ điều này, nó cũng làm cho code dễ đọc bằng cách giảm thiểu logic điều kiện phức tạp và loại bỏ trùng lặp.

Nhiều người nghĩ rằng việc tái cấu trúc chỉ đề cập đến việc ép buộc các mẫu thiết kế vào code của bạn, điều này hoàn toàn không đúng sự thật. Tuy nhiên, đó là những gì bạn dành rất nhiều thời gian của bạn làm. Tạo ra một thiết kế tốt hơn là mục tiêu tái cấu trúc đơn giản.

3. Các loại Code Refactoring

Có rất nhiều kỹ thuật tái cấu trúc mã, nhưng chúng ta sẽ chỉ thảo luận về vài kỹ thuật thường được sử dụng và dễ học. Sau đây là các loại Code Refactoring :

3.1. Preparatory Refactoring:

Trong khi tạo một ứng dụng, có một số khía cạnh mà người thử nghiệm có thể sử dụng trong mã của họ để làm cho nó dễ dàng hơn khi xây dựng các tính năng mới cho mã của họ. Tính năng này được gọi là tái cấu trúc chuẩn bị. Trong khi thêm một tính năng mới trong mã, mã hiện tại có thể được cấu trúc theo cách khiến họ khó thêm các tính năng mới. Với sự trợ giúp của kỹ thuật này, trước tiên họ có thể cấu trúc lại cấu trúc của mã hiện tại, giúp họ thêm các tính năng mới dễ dàng hơn.

3.2. Red-Green Refactoring:

Cách tiếp cận này của việc tái cấu trúc giúp người thử nghiệm xây dựng bộ thử nghiệm, viết mã và sửa đổi mã của họ trong một khoảng thời gian ngắn. Kiểu tái cấu trúc này dựa trên Phát triển theo hướng thử nghiệm, nơi người thử nghiệm đầu tiên viết các bài kiểm tra và sau đó sử dụng các bài kiểm tra này để sửa đổi và phát triển các ứng dụng phần mềm. Nó có thể được chia thành ba giai đoạn:

  • Red : Đây là giai đoạn đầu tiên của Red-Green-Refactor. Trong giai đoạn này, người thử nghiệm thường viết một bài kiểm tra thông báo cho việc thực hiện một tính năng. Chỉ khi các ngoại lệ được đáp ứng, bài thi sẽ vượt qua.

  • Green : Giai đoạn green là nơi người thử nghiệm sẽ triển khai mã để đảm bảo vượt qua bài kiểm tra. Mục đích chính là tìm một giải pháp tối ưu mà không sửa đổi việc thực hiện.

  • Refactor : Giai đoạn này là giai đoạn cuối cùng của chu trình liên quan đến tư duy và cách nhà phát triển / người thử nghiệm có thể triển khai ý tưởng để cải thiện mã với hiệu quả tốt hơn.

3.3. Composing Methods Refactoring:

Trong hầu hết các trường hợp, mã có thể rất dài và lặp đi lặp lại. Điều này có thể gây khó khăn trong việc hiểu logic của mã và do đó trở nên khó thay đổi hơn. Kỹ thuật tái cấu trúc này sẽ loại bỏ mọi mã lặp lại, hoặc loại bỏ bất kỳ sự sắp xếp nào khác Điều này sẽ giúp người kiểm thử dễ dàng hiểu được logic và tìm kiếm bất kỳ cải tiến nào khác.

3.4. Simplifying Conditional Expressions Refactoring:

Các biểu thức có điều kiện đôi khi có thể trở nên phức tạp hơn, điều này cũng làm phức tạp logic của chúng theo thời gian. Cách tiếp cận này của refactoring sẽ đơn giản hóa các biểu thức có điều kiện mà cuối cùng biến mã đơn giản và dễ hiểu. Logic đằng sau các biểu thức có điều kiện phức tạp trở nên rõ ràng hơn và dễ dàng hơn cho người thử hiểu logic tốt hơn.

4. Lợi ích của việc sử dụng Code Refactoring

Có nhiều lợi ích khác nhau có liên quan đến việc sử dụng tái cấu trúc mã. Những lợi ích này được đề cập dưới đây:

  • Efficient Process (Quy trình hiệu quả) : Sử dụng kỹ thuật này loại bỏ những nỗ lực cần thiết trong tương lai trong khi sửa đổi hoặc thêm bất kỳ tính năng mới nào vào mã mà cuối cùng cải thiện hiệu quả.

  • Eliminates Complexity (Loại bỏ sự phức tạp) : nó giúp giảm sự phức tạp, do đó giúp bạn và nhóm của bạn làm việc trên sự phát triển dễ dàng hơn

  • Sustainability (Tính bền vững) : Tái cấu trúc mã thường tổ chức và tạo ra các mã rõ ràng dễ đọc và dễ hiểu. Do đó, nó giúp duy trì một mã được cấu trúc đúng cách sẵn sàng để cải thiện trong tương lai.

  • Easy to Read and Understand (Dễ hiểu và hiểu) : Không nghi ngờ gì, việc tái cấu trúc mã sẽ giúp mọi người dễ đọc và hiểu mã hiệu quả hơn.

  • Understand the Concept Better (Hiểu rõ hơn về khái niệm) : Khi chỉ có một phương pháp xử lý tất cả các chức năng của quy trình, có nhiều khả năng nó trở nên đặc biệt phức tạp để hiểu. Nếu quá trình được chia nhỏ thành nhiều phần thì thật dễ hiểu những gì thực sự đang được thực hiện. Điều này có thể đạt được thông qua việc sử dụng tái cấu trúc mã.

5. Tại sao một Tester cần biết về Code Refactoring?

Từ đầu đến giờ có lẽ chúng ta chỉ nói đến những vấn đề mà các developers mới là những người phải bận tâm. Vậy nó có liên quan gì đến việc của các QA?

5.1. Đối với các developers, unit testers

Khi refactor code xong, nhiều code cũ bỏ đi, code mới thêm vào. Khi đó thì unit test sẽ fail, ngoài ra với các hệ thống cũ, sẽ chẳng có chút unit test nào, vì thế, đây chính là lúc thêm vào unit test cho code đã được refactor.

5.2. Đối với các tester

Khi một tính năng đã được refactor code (trong trường hợp ko thêm bớt gì về mặt chức năng).

  • Đối với testers, việc refactor code tương đương với việc họ phải thực hiện in-depth testing + regesstion testing. In-depth testing sẽ đảm bảo rằng tất cả các luồng, các chức năng đang hoạt động trước đây vẫn đúng. Regesstion testing sẽ đảm bảo cho việc refactor code của một module này sẽ không ảnh hưởng gì đến chức năng của các module khác.
  • Acception test rất quan trọng để đảm bảo cho việc release.
  • Thêm vào đó, bất kỳ kiểu test nào như load tests, security test, v.v cũng rất quan trọng theo đặc thù từng dự án.

5.3. Đối với Automation Test Engineers:

Việc refactor code cũng có thể khiến các script auto chạy fail, có thể do các nguyên nhân như:

  • Khi các Page objects thay đổi và script selenium chạy trên các Page objects đấy thì sẽ bị fail và cần được update.
  • Nếu code có những thay đổi sau quá trình refactor thì các script sẽ fail và cần được update.

Bởi vậy, quá trình sử dụng automation test chỉ nên thực hiện khi các tính năng đã ổn định, nếu không thì hoàn toàn có thể phải viết lại script khi tính năng đấy phát triển.

5.4. Đối với Test Leader:

  • Test Lead/ QA Lead cần phải làm việc với toàn bộ team để đảm bảo cho test planning được thực hiện một cách cẩn thận, đạt yêu cầu.
  • Phải nắm chắc được nghiệp vụ, chức năng của hệ thống vốn có để đảm bảo khi thực hiện refactor code thì hệ thống vẫn chạy đúng.
  • Phải chủ động khi lên kế hoạch thực hiện test, nếu cần thực hiện trên những môi trường mới hoặc công cụ mới thì cần phải yêu cầu sớm để trách bị trì hoãn khi giai đoạn testing bắt đầu.
  • Có thể nhờ người ngoài dự án hoặc một số end-user trải nghiệm để đóng góp cho quá trình test.

6. Sử dụng kỹ thuật Refactoring cho Testers

Tái cấu trúc có thể cũng quan trọng đối với người thử nghiệm, dưới đây là một vài lý do để minh họa tại sao điều quan trọng đối với người thử nghiệm là sử dụng kỹ thuật tái cấu trúc.

  • Testers đảm bảo kiểm tra đúng chức năng của ứng dụng. Vì bài kiểm tra được viết bởi những người kiểm tra cũng là mã, cần thiết cho những người thử nghiệm sử dụng kỹ thuật tái cấu trúc để đơn giản hóa mã phức tạp của họ.

  • Mã thử nghiệm được viết bởi người thử nghiệm phải dễ hiểu và dễ đọc. Sử dụng tái cấu trúc mã, trình kiểm tra có thể sử dụng các biểu thức tốt hơn giúp các người thử nghiệm khác hiểu mã kiểm tra dễ dàng hơn.

  • Khi phát triển sử dụng tái cấu trúc mã để làm cho mã của họ dễ cập nhật hơn, theo cách tương tự, người thử nghiệm cũng có thể sử dụng kỹ thuật này để làm cho bài kiểm tra của họ dễ dàng cập nhật.

7. Kết luận

Tóm lại, việc refactor code là một quá trình làm sạch, đơn giản hoá code mà không làm thay đổi chức năng của nó.

Một đoạn code có thể cần phải được refactor vì lý do code thối, nợ kĩ thuật hoặc khi dự án đang theo phương pháp Agile.

Đối với tester, việc refactor code đồng nghĩa với việc phải thực hiện in-depth testing và regesstion test.

Test Lead/ QA Lead là người chủ động trong việc lên kế hoạch, nắm bắt rõ nghiệp vụ và dự trù được các tình huống bất lợi để đảm bảo cho việc refactor code không làm ảnh hưởng đến chức năng của hệ thống.

Nguồn tham khảo :

https://www.testbytes.net/blog/code-refactoring/?fbclid=IwAR2ODQZVdYjKDJWVLd6ARmYekvGxN50bUD3dDosXcOdwULuPO04IKh4weJk https://www.softwaretestinghelp.com/code-refactoring/amp/?fbclid=IwAR15kTO_yQPNZEbX6ww4QOHJTFVwOT4gZWoGLXrNzjPYFTaJU_rdMGnTSDs