Không có gì để stub phạm nghĩa trong lập trình?


117

Ví dụ, nó có nghĩa gì trong trích dẫn này?

Tích hợp với API bên ngoài gần như là một sự đảm bảo trong bất kỳ ứng dụng web hiện đại nào. Để kiểm tra hiệu quả hội nhập như vậy, bạn cần phải còn sơ khai nó ra. Một sơ khai tốt phải dễ tạo và luôn cập nhật với các phản hồi API thực tế, hiện tại. Trong bài đăng này, chúng tôi sẽ phác thảo một chiến lược thử nghiệm bằng cách sử dụng sơ khai cho API bên ngoài.


9
Bạn đã xem câu trả lời được chấp nhận trong "Sơ khai" là gì chưa? ?
Nick

Câu trả lời:


103

Sơ khai là một sự thay thế có thể kiểm soát đối với Phụ thuộc hiện tại (hoặc cộng tác viên) trong hệ thống. Bằng cách sử dụng sơ khai, bạn có thể kiểm tra mã của mình mà không phải xử lý trực tiếp phụ thuộc.

Sự phụ thuộc bên ngoài - Sự phụ thuộc hiện có:
Đó là một đối tượng trong hệ thống của bạn mà mã của bạn được kiểm tra tương tác với và trên đó bạn không có quyền kiểm soát. (Ví dụ phổ biến là hệ thống tập tin, chủ đề, bộ nhớ, thời gian, v.v.)

Forexample trong mã dưới đây:

public void Analyze(string filename)
    {
        if(filename.Length<8)
        {
            try
            {
                errorService.LogError("long file entered named:" + filename);
            }
            catch (Exception e)
            {
                mailService.SendEMail("admin@hotmail.com", "ErrorOnWebService", "someerror");
            }
        }
    }

Bạn muốn kiểm tra phương thức mailService.SendEMail () , nhưng để làm được điều đó, bạn cần mô phỏng Ngoại lệ trong phương thức kiểm tra của mình, vì vậy bạn chỉ cần tạo một đối tượng dịch vụ lỗi Fake Stub để mô phỏng kết quả bạn muốn, sau đó mã kiểm tra của bạn sẽ có thể kiểm tra phương thức mailService.SendEMail () . Như bạn thấy, bạn cần mô phỏng một kết quả từ một Phụ thuộc khác là đối tượng lớp ErrorService (Đối tượng phụ thuộc hiện tại).


9
Tiếng Anh? Một phụ thuộc hiện có là gì?
Jwan622

17
@ Jwan622 Theo thuật ngữ cư sĩ: Bất cứ điều gì mà mã sử dụng. Nó có thể giúp hiểu nếu bạn đọc lại và thay thế "phụ thuộc" bằng "lớp" hoặc "chức năng" hoặc bất cứ điều gì (phụ thuộc vào nền tảng của bạn). Đôi khi, sử dụng lớp / hàm hiện có không phải là một tùy chọn khả thi và bạn cần sơ khai (ví dụ: trong kiểm tra đơn vị tự động cho các chức năng dựa trên môi trường như ngày & giờ hiện tại của hệ thống).
MasterMastic

101

Một sơ khai , trong bối cảnh này, có nghĩa là một thực hiện giả.

Đó là, một triển khai giả mạo đơn giản, phù hợp với giao diện và sẽ được sử dụng để thử nghiệm.


3
Thông tin chi tiết được cung cấp trong bài viết nổi tiếng về Mocks Ar't Stub của Martin Fowler: "Nhưng thường thì tôi không thấy các đối tượng giả được mô tả kém. Đặc biệt tôi thấy chúng thường bị nhầm lẫn với sơ khai - một trợ thủ phổ biến cho môi trường thử nghiệm."
pba

61

Điều khoản của Layman, đó là dữ liệu giả (hoặc dữ liệu giả, dữ liệu thử nghiệm, v.v.) mà bạn có thể sử dụng để kiểm tra hoặc phát triển mã của mình cho đến khi bạn (hoặc bên kia) sẵn sàng trình bày / nhận dữ liệu thực. Đó là "Lorem Ipsum" của một lập trình viên.

Cơ sở dữ liệu nhân viên chưa sẵn sàng? Tạo một cái đơn giản với Jane Doe, John Doe ... vv. API chưa sẵn sàng? Tạo một tệp giả bằng cách tạo tệp .json tĩnh chứa dữ liệu giả.


1
Cảm ơn bạn vì ví dụ :)
CapturedTree

8

Trong bối cảnh này, từ "sơ khai" được sử dụng thay cho "giả", nhưng vì mục đích rõ ràng và chính xác, tác giả nên sử dụng "giả", vì "giả" là một loại sơ khai, nhưng để thử nghiệm. Để tránh nhầm lẫn hơn nữa, chúng ta cần xác định sơ khai là gì.

Trong ngữ cảnh chung, sơ khai là một phần của chương trình (thường là hàm hoặc đối tượng) gói gọn sự phức tạp của việc gọi chương trình khác (thường nằm trên một máy khác, VM hoặc quá trình - nhưng không phải lúc nào cũng có thể là cục bộ vật). Bởi vì chương trình thực tế để gọi thường không nằm trên cùng một không gian bộ nhớ, nên việc gọi nó đòi hỏi nhiều thao tác như xử lý địa chỉ, thực hiện lệnh gọi từ xa thực tế, sắp xếp / xê-ri hóa dữ liệu / đối số được truyền (và giống với kết quả tiềm năng), thậm chí có thể xử lý xác thực / bảo mật, v.v. Lưu ý rằng trong một số bối cảnh, các sơ khai cũng được gọi là proxy (chẳng hạn như proxy động trong Java).

Mock là một loại sơ khai rất cụ thể và hạn chế, bởi vì một giả là một thay thế của một chức năng hoặc đối tượng khác để thử nghiệm. Trong thực tế, chúng ta thường sử dụng giả làm chương trình cục bộ (hàm hoặc đối tượng) để thay thế chương trình từ xa trong môi trường thử nghiệm. Trong mọi trường hợp, giả có thể mô phỏng hành vi thực tế của chương trình được thay thế trong ngữ cảnh bị hạn chế.

Hầu hết các loại sơ khai nổi tiếng rõ ràng là dành cho lập trình phân tán, khi cần gọi các thủ tục từ xa ( RPC ) hoặc các đối tượng từ xa ( RMI , CORBA ). Hầu hết các khung / thư viện lập trình phân tán sẽ tự động hóa việc tạo ra các sơ khai để bạn không phải viết chúng theo cách thủ công. Sơ khai có thể được tạo từ một định nghĩa giao diện, được viết bằng IDL chẳng hạn (nhưng bạn cũng có thể sử dụng bất kỳ ngôn ngữ nào để xác định giao diện).

Thông thường, trong RPC, RMI, CORBA, v.v., người ta phân biệt các cuống phía máy khách , chủ yếu xử lý việc sắp xếp / xâu chuỗi các đối số và thực hiện lệnh gọi từ xa, và các cuống phía máy chủ , chủ yếu xử lý việc sắp xếp / khử lưu trữ các đối số và thực sự thực hiện chức năng / phương thức từ xa. Rõ ràng, các cuống máy khách được đặt ở phía máy khách, trong khi các cuống sever (thường được gọi là khung xương) nằm ở phía máy chủ.

Viết các sơ khai hiệu quả và chung chung trở nên khá khó khăn khi xử lý các tham chiếu đối tượng. Hầu hết các khung đối tượng phân tán như RMI và CORBA xử lý các tham chiếu đối tượng phân tán, nhưng đó là điều mà hầu hết các lập trình viên tránh trong môi trường REST chẳng hạn. Thông thường, trong môi trường REST, các lập trình viên JavaScript tạo các hàm sơ khai đơn giản để đóng gói các lệnh AJAX (tuần tự hóa đối tượng được hỗ trợ bởi JSON.parseJSON.stringify). Các Swagger codegen dự án cung cấp một hỗ trợ rộng rãi cho tự động tạo ra cuống REST trong ngôn ngữ khác nhau.


3

Bạn cũng có một khung kiểm tra rất tốt để tạo ra một sơ khai như vậy. Một trong những thứ tôi thích nhất là Mockito Ngoài ra còn có EasyMock và những thứ khác ... Nhưng Mockito thật tuyệt khi bạn nên đọc nó - gói rất thanh lịch và mạnh mẽ


3

Stub là một định nghĩa hàm có tên hàm chính xác, số lượng tham số chính xác và tạo ra kết quả giả của loại chính xác.

Nó giúp viết bài kiểm tra và phục vụ như một loại giàn giáo để có thể chạy các ví dụ ngay cả trước khi thiết kế chức năng hoàn tất


3

Cụm từ này gần như chắc chắn là một sự tương tự với một giai đoạn trong xây dựng nhà - hệ thống ống nước "nhổ ra". Trong quá trình xây dựng, trong khi các bức tường vẫn mở, hệ thống ống nước thô được đưa vào. Điều này là cần thiết để việc xây dựng tiếp tục. Sau đó, khi mọi thứ xung quanh đã sẵn sàng, một người quay lại và thêm vòi và nhà vệ sinh cùng các sản phẩm cuối cùng thực tế. (Xem ví dụ Cách cài đặt ống dẫn nước .)

Khi bạn "khai thác" một chức năng trong lập trình, bạn xây dựng đủ chức năng đó để làm việc (để thử nghiệm hoặc để viết mã khác). Sau đó, bạn quay lại sau và thay thế nó bằng việc thực hiện đầy đủ.


0

Sơ khai RPC

  • Về cơ bản, sơ khai phía máy khách là một thủ tục nhìn vào máy khách như thể nó là một thủ tục máy chủ có thể gọi được.
  • Một cuống phía máy chủ nhìn vào máy chủ như thể đó là một máy khách đang gọi.
  • Chương trình máy khách nghĩ rằng nó đang gọi máy chủ; trong thực tế, nó đang gọi khách hàng còn sơ khai.
  • Chương trình máy chủ nghĩ rằng nó được gọi bởi máy khách; trong thực tế, nó được gọi bởi cuống máy chủ.
  • Các cuống gửi tin nhắn cho nhau để làm cho RPC xảy ra.

Nguồn


0

"Stubbing-out một chức năng có nghĩa là bạn sẽ chỉ viết đủ để cho thấy rằng chức năng đã được gọi, để lại chi tiết cho sau này khi bạn có nhiều thời gian hơn."

Từ: Mitch Hãy tự dạy mình C ++, Jesse Liberty và Bradley Jones

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.