Kiểm tra ứng dụng chủ đề

Trong chương này, chúng ta sẽ tìm hiểu về kiểm thử các ứng dụng luồng. Chúng ta cũng sẽ tìm hiểu tầm quan trọng của thử nghiệm.

Tại sao phải kiểm tra?

Trước khi đi sâu vào thảo luận về tầm quan trọng của thử nghiệm, chúng ta cần biết thử nghiệm là gì. Nói chung, kiểm thử là một kỹ thuật tìm hiểu xem một thứ gì đó đang hoạt động tốt như thế nào. Mặt khác, cụ thể nếu chúng ta nói về chương trình máy tính hoặc phần mềm thì kiểm thử là kỹ thuật truy cập chức năng của một chương trình phần mềm.

Trong phần này, chúng ta sẽ thảo luận về tầm quan trọng của kiểm thử phần mềm. Trong phát triển phần mềm, phải kiểm tra kỹ trước khi phát hành phần mềm cho khách hàng. Đó là lý do tại sao việc kiểm tra phần mềm bởi đội ngũ kiểm thử có kinh nghiệm là rất quan trọng. Hãy xem xét các điểm sau để hiểu tầm quan trọng của kiểm thử phần mềm -

Cải thiện chất lượng phần mềm

Chắc chắn rằng không có công ty nào muốn cung cấp phần mềm chất lượng thấp và không khách hàng nào muốn mua phần mềm chất lượng thấp. Kiểm tra cải thiện chất lượng của phần mềm bằng cách tìm và sửa các lỗi trong đó.

Sự hài lòng của khách hàng

Phần quan trọng nhất của bất kỳ doanh nghiệp nào là sự hài lòng của khách hàng. Bằng cách cung cấp phần mềm không có lỗi và chất lượng tốt, các công ty có thể đạt được sự hài lòng của khách hàng.

Giảm bớt tác động của các tính năng mới

Giả sử chúng ta đã tạo ra một hệ thống phần mềm gồm 10000 dòng và chúng ta cần thêm một tính năng mới thì nhóm phát triển sẽ lo ngại về tác động của tính năng mới này đối với toàn bộ phần mềm. Ở đây, thử nghiệm cũng đóng một vai trò quan trọng bởi vì nếu nhóm thử nghiệm đã thực hiện một bộ thử nghiệm tốt thì nó có thể giúp chúng ta tránh khỏi bất kỳ sự cố thảm khốc nào có thể xảy ra.

Kinh nghiệm người dùng

Một phần quan trọng nhất khác của bất kỳ doanh nghiệp nào là trải nghiệm của người dùng sản phẩm đó. Chỉ có thử nghiệm mới có thể đảm bảo rằng người dùng cuối cảm thấy đơn giản và dễ sử dụng sản phẩm.

Cắt giảm chi phí

Thử nghiệm có thể cắt giảm tổng chi phí của phần mềm bằng cách tìm và sửa các lỗi trong giai đoạn thử nghiệm của quá trình phát triển phần mềm hơn là sửa sau khi giao hàng. Nếu có một lỗi lớn sau khi phân phối phần mềm thì nó sẽ làm tăng chi phí hữu hình nói về chi phí và chi phí vô hình nói về sự không hài lòng của khách hàng, danh tiếng tiêu cực của công ty, v.v.

Kiểm tra những gì?

Bạn nên có kiến ​​thức thích hợp về những gì sẽ được kiểm tra. Trong phần này, trước tiên chúng ta sẽ hiểu động cơ chính của tester khi kiểm thử bất kỳ phần mềm nào. Phạm vi mã, tức là, nên tránh bao nhiêu dòng mã mà bộ thử nghiệm của chúng tôi truy cập trong khi thử nghiệm. Đó là bởi vì, trong khi thử nghiệm, chỉ tập trung vào số lượng dòng mã không tạo thêm giá trị thực cho hệ thống của chúng tôi. Có thể vẫn còn một số lỗi, lỗi này sẽ phản ánh muộn hơn ở giai đoạn sau ngay cả sau khi triển khai.

Hãy xem xét những điểm quan trọng sau liên quan đến những gì cần kiểm tra -

  • Chúng ta cần tập trung vào việc kiểm tra chức năng của mã hơn là độ phủ của mã.

  • Chúng ta cần kiểm tra những phần quan trọng nhất của mã trước và sau đó chuyển sang những phần ít quan trọng hơn của mã. Nó chắc chắn sẽ tiết kiệm thời gian.

  • Người thử nghiệm phải có vô số thử nghiệm khác nhau để có thể đẩy phần mềm lên đến giới hạn của nó.

Các cách tiếp cận để kiểm tra các chương trình phần mềm đồng thời

Do khả năng sử dụng khả năng thực sự của kiến ​​trúc đa lõi, các hệ thống phần mềm đồng thời đang thay thế các hệ thống tuần tự. Trong thời gian gần đây, các chương trình hệ thống đồng thời đang được sử dụng trong mọi thứ, từ điện thoại di động đến máy giặt, từ ô tô đến máy bay, v.v. Chúng ta cần phải cẩn thận hơn trong việc kiểm tra các chương trình phần mềm đồng thời vì nếu chúng ta đã thêm nhiều luồng vào ứng dụng một luồng có đã là một lỗi, thì chúng ta sẽ có nhiều lỗi.

Các kỹ thuật kiểm tra cho các chương trình phần mềm đồng thời đang tập trung sâu rộng vào việc lựa chọn xen kẽ các mô hình có thể gây hại như điều kiện chủng tộc, bế tắc và vi phạm tính nguyên tử. Sau đây là hai cách tiếp cận để kiểm tra các chương trình phần mềm đồng thời:

Khám phá có hệ thống

Cách tiếp cận này nhằm mục đích khám phá không gian của sự đan xen càng rộng càng tốt. Những cách tiếp cận như vậy có thể áp dụng kỹ thuật brute-force và những cách khác áp dụng kỹ thuật giảm thứ tự từng phần hoặc kỹ thuật heuristic để khám phá không gian của sự đan xen.

Hướng về tài sản

Các phương pháp tiếp cận theo hướng thuộc tính dựa trên quan sát rằng các lỗi đồng thời có nhiều khả năng xảy ra dưới sự đan xen làm lộ các thuộc tính cụ thể như kiểu truy cập bộ nhớ đáng ngờ. Các phương pháp tiếp cận theo hướng thuộc tính khác nhau nhắm vào các lỗi khác nhau như điều kiện chủng tộc, bế tắc và vi phạm tính nguyên tử, điều này còn phụ thuộc vào một hoặc các thuộc tính cụ thể khác.

Chiến lược kiểm tra

Chiến lược kiểm tra còn được gọi là cách tiếp cận kiểm tra. Chiến lược xác định cách thức kiểm tra sẽ được thực hiện. Cách tiếp cận kiểm tra có hai kỹ thuật -

Chủ động

Một cách tiếp cận trong đó quá trình thiết kế thử nghiệm được bắt đầu càng sớm càng tốt để tìm và sửa các lỗi trước khi tạo bản dựng.

Phản ứng

Một cách tiếp cận trong đó thử nghiệm không bắt đầu cho đến khi hoàn thành quá trình phát triển.

Trước khi áp dụng bất kỳ chiến lược hoặc phương pháp kiểm tra nào trên chương trình python, chúng ta phải có ý tưởng cơ bản về loại lỗi mà chương trình phần mềm có thể mắc phải. Các lỗi như sau:

Lỗi cú pháp

Trong quá trình xây dựng chương trình, có thể mắc nhiều lỗi nhỏ. Các lỗi phần lớn là do lỗi đánh máy. Ví dụ, thiếu dấu hai chấm hoặc sai chính tả của từ khóa, vv Những lỗi như vậy là do sai cú pháp chương trình và không logic. Do đó, những lỗi này được gọi là lỗi cú pháp.

Lỗi ngữ nghĩa

Các lỗi ngữ nghĩa còn được gọi là lỗi lôgic. Nếu có lỗi logic hoặc ngữ nghĩa trong chương trình phần mềm thì câu lệnh sẽ biên dịch và chạy chính xác nhưng nó sẽ không đưa ra kết quả mong muốn vì logic không đúng.

Kiểm tra đơn vị

Đây là một trong những chiến lược kiểm thử được sử dụng nhiều nhất để kiểm tra các chương trình python. Chiến lược này được sử dụng để kiểm tra các đơn vị hoặc thành phần của mã. Theo đơn vị hoặc thành phần, chúng tôi có nghĩa là các lớp hoặc chức năng của mã. Kiểm thử đơn vị đơn giản hóa việc kiểm tra các hệ thống lập trình lớn bằng cách kiểm tra các đơn vị “nhỏ”. Với sự trợ giúp của khái niệm trên, kiểm thử đơn vị có thể được định nghĩa là một phương pháp trong đó các đơn vị mã nguồn riêng lẻ được kiểm tra để xác định xem chúng có trả lại đầu ra mong muốn hay không.

Trong các phần tiếp theo, chúng ta sẽ tìm hiểu về các mô-đun Python khác nhau để kiểm tra đơn vị.

mô-đun đơn nhất

Mô-đun đầu tiên cho kiểm thử đơn vị là mô-đun đơn vị nhất. Nó được lấy cảm hứng từ JUnit và theo mặc định được bao gồm trong Python3.6. Nó hỗ trợ tự động hóa kiểm tra, chia sẻ mã thiết lập và tắt máy cho các bài kiểm tra, tổng hợp các bài kiểm tra thành bộ sưu tập và tính độc lập của các bài kiểm tra khỏi khung báo cáo.

Sau đây là một vài khái niệm quan trọng được hỗ trợ bởi mô-đun đơn nhất

Văn bản cố định

Nó được sử dụng để thiết lập một bài kiểm tra để nó có thể được chạy trước khi bắt đầu bài kiểm tra và hủy bỏ sau khi kết thúc bài kiểm tra. Nó có thể liên quan đến việc tạo cơ sở dữ liệu tạm thời, thư mục, v.v. cần thiết trước khi bắt đầu kiểm tra.

Trường hợp thử nghiệm

Trường hợp thử nghiệm kiểm tra xem phản hồi bắt buộc có phải đến từ một tập hợp đầu vào cụ thể hay không. Mô-đun đơn nhất bao gồm một lớp cơ sở có tên là TestCase có thể được sử dụng để tạo các trường hợp thử nghiệm mới. Nó bao gồm hai phương pháp mặc định:

  • setUp()- một phương pháp móc để thiết lập bộ cố định thử nghiệm trước khi thực hiện nó. Điều này được gọi trước khi gọi các phương pháp thử nghiệm được triển khai.

  • tearDown( - một phương thức hook để giải cấu trúc lớp cố định sau khi chạy tất cả các bài kiểm tra trong lớp.

Bộ thử nghiệm

Nó là một tập hợp các bộ thử nghiệm, các trường hợp thử nghiệm hoặc cả hai.

Người chạy thử nghiệm

Nó kiểm soát việc chạy các trường hợp hoặc bộ thử nghiệm và cung cấp kết quả cho người dùng. Nó có thể sử dụng GUI hoặc giao diện văn bản đơn giản để cung cấp kết quả.

Example

Chương trình Python sau sử dụng mô-đun đơn nhất để kiểm tra mô-đun có tên Fibonacci. Chương trình giúp tính toán chuỗi Fibonacci của một số. Trong ví dụ này, chúng tôi đã tạo một lớp có tên Fibo_test, để xác định các trường hợp thử nghiệm bằng cách sử dụng các phương pháp khác nhau. Các phương thức này được kế thừa từ unittest.TestCase. Chúng tôi đang sử dụng hai phương thức mặc định - setUp () và ráchDown (). Chúng tôi cũng xác định phương pháp testfibocal. Tên của bài kiểm tra phải được bắt đầu bằng bài kiểm tra chữ cái. Trong khối cuối cùng, unittest.main () cung cấp một giao diện dòng lệnh cho tập lệnh thử nghiệm.

import unittest
def fibonacci(n):
   a, b = 0, 1
   for i in range(n):
   a, b = b, a + b
   return a
class Fibo_Test(unittest.TestCase):
   def setUp(self):
   print("This is run before our tests would be executed")
   def tearDown(self):
   print("This is run after the completion of execution of our tests")

   def testfibocal(self):
   self.assertEqual(fib(0), 0)
   self.assertEqual(fib(1), 1)
   self.assertEqual(fib(5), 5)
   self.assertEqual(fib(10), 55)
   self.assertEqual(fib(20), 6765)

if __name__ == "__main__":
   unittest.main()

Khi chạy từ dòng lệnh, tập lệnh trên tạo ra kết quả giống như sau:

Đầu ra

This runs before our tests would be executed.
This runs after the completion of execution of our tests.
.
----------------------------------------------------------------------
Ran 1 test in 0.006s
OK

Bây giờ, để làm rõ hơn, chúng tôi đang thay đổi mã của mình, điều này đã giúp xác định mô-đun Fibonacci.

Hãy xem xét khối mã sau đây làm ví dụ:

def fibonacci(n):
   a, b = 0, 1
   for i in range(n):
   a, b = b, a + b
   return a

Một số thay đổi đối với khối mã được thực hiện như hình dưới đây -

def fibonacci(n):
   a, b = 1, 1
   for i in range(n):
   a, b = b, a + b
   return a

Bây giờ, sau khi chạy tập lệnh với mã đã thay đổi, chúng ta sẽ nhận được kết quả sau:

This runs before our tests would be executed.
This runs after the completion of execution of our tests.
F
======================================================================
FAIL: testCalculation (__main__.Fibo_Test)
----------------------------------------------------------------------
Traceback (most recent call last):
File "unitg.py", line 15, in testCalculation
self.assertEqual(fib(0), 0)
AssertionError: 1 != 0
----------------------------------------------------------------------
Ran 1 test in 0.007s

FAILED (failures = 1)

Kết quả trên cho thấy rằng mô-đun đã không cung cấp đầu ra mong muốn.

Mô-đun Docktest

Mô-đun docktest cũng giúp kiểm tra đơn vị. Nó cũng được đóng gói sẵn với python. Nó dễ sử dụng hơn mô-đun đơn nhất. Mô-đun đơn nhất phù hợp hơn cho các bài kiểm tra phức tạp. Để sử dụng mô-đun học thuyết, chúng ta cần nhập nó. Chuỗi doc của hàm tương ứng phải có phiên python tương tác cùng với đầu ra của chúng.

Nếu mọi thứ đều ổn trong mã của chúng tôi thì sẽ không có đầu ra từ mô-đun docktest; nếu không, nó sẽ cung cấp đầu ra.

Thí dụ

Ví dụ Python sau đây sử dụng mô-đun docktest để kiểm tra một mô-đun có tên Fibonacci, giúp tính toán chuỗi Fibonacci của một số.

import doctest
def fibonacci(n):
   """
   Calculates the Fibonacci number

   >>> fibonacci(0)
   0
   >>> fibonacci(1)
   1
   >>> fibonacci(10)
   55
   >>> fibonacci(20)
   6765
   >>>

   """
   a, b = 1, 1
   for i in range(n):
   a, b = b, a + b
   return a
      if __name__ == "__main__":
   doctest.testmod()

Chúng ta có thể thấy rằng chuỗi doc của hàm tương ứng có tên fib có phiên python tương tác cùng với các kết quả đầu ra. Nếu mã của chúng tôi ổn thì sẽ không có đầu ra từ mô-đun học thuyết. Nhưng để xem nó hoạt động như thế nào, chúng ta có thể chạy nó với tùy chọn –v.

(base) D:\ProgramData>python dock_test.py -v
Trying:
   fibonacci(0)
Expecting:
   0
ok
Trying:
   fibonacci(1)
Expecting:
   1
ok
Trying:
   fibonacci(10)
Expecting:
   55
ok
Trying:
   fibonacci(20)
Expecting:
   6765
ok
1 items had no tests:
   __main__
1 items passed all tests:
4 tests in __main__.fibonacci
4 tests in 2 items.
4 passed and 0 failed.
Test passed.

Bây giờ, chúng tôi sẽ thay đổi mã đã giúp xác định mô-đun Fibonacci

Hãy xem xét khối mã sau đây làm ví dụ:

def fibonacci(n):
   a, b = 0, 1
   for i in range(n):
   a, b = b, a + b
   return a

Khối mã sau giúp thực hiện các thay đổi:

def fibonacci(n):
   a, b = 1, 1
   for i in range(n):
   a, b = b, a + b
   return a

Sau khi chạy script ngay cả khi không có tùy chọn –v, với mã đã thay đổi, chúng ta sẽ nhận được kết quả như hình dưới đây.

Đầu ra

(base) D:\ProgramData>python dock_test.py
**********************************************************************
File "unitg.py", line 6, in __main__.fibonacci
Failed example:
   fibonacci(0)
Expected:
   0
Got:
   1
**********************************************************************
File "unitg.py", line 10, in __main__.fibonacci
Failed example:
   fibonacci(10)
Expected:
   55
Got:
   89
**********************************************************************
File "unitg.py", line 12, in __main__.fibonacci
Failed example:
   fibonacci(20)
Expected:
   6765
Got:
   10946
**********************************************************************
1 items had failures:
   3 of 4 in __main__.fibonacci
***Test Failed*** 3 failures.

Chúng ta có thể thấy trong đầu ra ở trên rằng ba bài kiểm tra đã không thành công.