Hướng dẫn php sandbox - hộp cát php

Chúng tôi bắt đầu thực hiện TDD và thử nghiệm mọi thứ, nhưng sau đó chúng tôi bắt gặp một truy vấn SQL và chúng tôi rất bối rối. Chúng tôi có thể kiểm tra một số logic một cách độc lập, nhưng chúng tôi buộc phải chạm vào cơ sở dữ liệu trong các thử nghiệm từ đầu đến cuối hoặc trong các hoạt động liên quan đến các toán tử SQL, như SUM ().

Show

Chúng tôi có thể bắt đầu sử dụng cơ sở dữ liệu được chia sẻ của mình trên máy chủ phát triển để thực hiện các bài kiểm tra . Nhưng sau đó, bộ kiểm tra của chúng tôi không thể chạy đồng thời (không có gì tệ hơn là phải nói với đồng nghiệp của bạn rằng bạn phải chạy bộ và họ không nên chạm vào nó.)có thể bắt đầu sử dụng cơ sở dữ liệu được chia sẻ của mình trên máy chủ phát triển để thực hiện các bài kiểm tra . Nhưng sau đó, bộ kiểm tra của chúng tôi không thể chạy đồng thời (không có gì tệ hơn là phải nói với đồng nghiệp của bạn rằng bạn phải chạy bộ và họ không nên chạm vào nó.)

Và lược đồ của cơ sở dữ liệu đó là gì? Lấy từ chi nhánh và phát hành ứng dụng? Cơ sở dữ liệu Sandbox thúc đẩy kiểm tra cách ly bằng cách cung cấp cơ sở dữ liệu riêng cho từng người chạy thử nghiệm.
Cơ sở dữ liệu Sandbox thúc đẩy kiểm tra cách ly bằng cách cung cấp cơ sở dữ liệu riêng cho từng người chạy thử nghiệm.

Lý tưởng nhất, đối với mọi phiên bản của bộ kiểm tra sẽ có sẵn một cơ sở dữ liệu riêng. Nếu bạn là nhà phát triển chạy hai bộ thử nghiệm cùng một lúc hoặc trong cùng một ngày (có thể các tập hợp thử nghiệm khác nhau hoặc cùng một thử nghiệm từ hai máy), bạn sẽ đạt được các cơ sở dữ liệu khác nhau.

Nếu không có hộp cát, bạn sẽ gặp phải các lỗi không liên tục do đồng thời hoặc các thử nghiệm không thể bắt đầu do lược đồ sai được triển khai trên cơ sở dữ liệu chung hoặc khi tải sai đồ đạc. được triển khai trên cơ sở dữ liệu chung hoặc khi tải sai đồ đạc.

Sau này chúng ta sẽ xem cách thiết lập lại tình huống để các bài kiểm tra luôn bắt đầu từ cùng một vật cố định. Tuy nhiên, không phải lo lắng cho nhà phát triển với Cơ sở dữ liệu Sandbox: anh ta có thể tự do sửa đổi cơ sở dữ liệu của mình và làm việc trên bản sao mã nguồn của mình.

Thực hiện

Nếu bạn có ý định sử dụng một cơ sở dữ liệu thực trong bộ thử nghiệm, bạn phải cung cấp khả năng cấu hình cho cơ sở dữ liệu được sử dụng bởi các nhà phát triển cục bộ.

Tôi cũng cho rằng chúng ta đang nói về cơ sở dữ liệu quan hệ: các mẫu này đã được trích xuất từ ​​loại ứng dụng này.

Ngoài ra, bạn có thể thực hiện giai đoạn thiết lập lịch thi đấu xây dựng cơ sở dữ liệu mới cho mỗi lần chạy thử (tất nhiên bao gồm cơ sở dữ liệu). Tôi sử dụng Sqlite cho phần lớn các bài kiểm tra, thông qua PDO, việc đơn giản hóa nó và Lớp trừu tượng hóa cơ sở dữ liệu (DBAL) rất có thể tạo ra cú pháp đúng cho các truy vấn CREATE TABLE và INSERT, phụ thuộc vào loại cơ sở dữ liệu mà bạn đã kết nối đến.

Ngay cả các bức tường trong một cửa hàng dựa trên PHP bây giờ cũng biết rằng Sqlite là cách để sử dụng các bộ thử nghiệm : miễn phí, nhanh chóng và đáp ứng hầu hết các yêu cầu chức năng của các ứng dụng web. Lược đồ được xây dựng khi bắt đầu chạy thử và được giữ trong bộ nhớ; nó bị phá hủy sau khi chạy thử kết thúc. Nó không thể được hộp cát nhiều hơn thế này. : miễn phí, nhanh chóng và đáp ứng hầu hết các yêu cầu chức năng của các ứng dụng web. Lược đồ được xây dựng khi bắt đầu chạy thử và được giữ trong bộ nhớ; nó bị phá hủy sau khi chạy thử kết thúc. Nó không thể được hộp cát nhiều hơn thế này.

Vấn đề của SQLite là thiếu các chức năng như khóa ngoại hoặc các hàm tổng hợp nâng cao khác. Bạn vẫn sẽ phải kiểm tra ở đâu đó với cơ sở dữ liệu thực: Sqlite không cho tôi sự tự tin để đi vào sản xuất.thiếu các chức năng như khóa ngoại hoặc các hàm tổng hợp nâng cao khác. Bạn vẫn sẽ phải kiểm tra ở đâu đó với cơ sở dữ liệu thực: Sqlite không cho tôi sự tự tin để đi vào sản xuất.

Biến thể

Hầu hết các biến thể này được hiển thị lỗi thời bởi lần đầu tiên. Thay thế db nhẹ được tạo ra rất nhanh: không có đối tượng chia sẻ, lược đồ được cập nhật nhất cho mã của bạn. vấn đề duy nhất là tốc độ hoặc số lượng giấy phép nếu bạn sử dụng db độc quyền, nhưng nếu bạn sử dụng Sqlite trong bộ nhớ, bạn sẽ không gặp vấn đề gì. PDO và Học thuyết 1/2 có thể thay thế nó cùng với mỗi ORM tự trọng.

  • Sandbox cơ sở dữ liệu chuyên dụng : cơ sở dữ liệu nhẹ, một cho mỗi nhà phát triển / máy. Giữ trên các máy cục bộ cùng với mã hoặc trên một máy chủ dùng chung để đơn giản. : cơ sở dữ liệu nhẹ, một cho mỗi nhà phát triển / máy. Giữ trên các máy cục bộ cùng với mã hoặc trên một máy chủ dùng chung để đơn giản.
  • DB Schema per Test Runner : một lược đồ bất biến, chỉ được sử dụng để đọc, được sao chép cho mỗi người chạy. : một lược đồ bất biến, chỉ được sử dụng để đọc, được sao chép cho mỗi người chạy.
  • Lược đồ phân vùng cơ sở dữ liệu : dữ liệu trong cùng một cơ sở dữ liệu được sử dụng bởi các vận động viên khác nhau, ví dụ: bạn tạo một người dùng thử nghiệm cho mỗi người trong số họ để làm cho xác thực hoạt động. : dữ liệu trong cùng một cơ sở dữ liệu được sử dụng bởi các vận động viên khác nhau, ví dụ: bạn tạo một người dùng thử nghiệm cho mỗi người trong số họ để làm cho xác thực hoạt động.

Ví dụ

Tôi chỉ cho bạn cách tạo cơ sở dữ liệu Sqlite với lược đồ và dữ liệu cho mỗi bài kiểm tra; Ví dụ này đánh đổi tốc độ vì đơn giản vì việc xây dựng lại db cho mỗi thử nghiệm rất tốn kém ngay cả đối với Sqlite (vẫn nhanh hơn một db thực như MySQL hoặc Postgres). Có các giải pháp (bài viết tiếp theo) để tránh phá hủy cơ sở dữ liệu và tái chế nó giữa các lần kiểm tra (nhưng không phải giữa các lần chạy, để tránh xung đột lược đồ.)

db = new PDO('sqlite::memory:');
        // if you want portable CREATE statements, Doctrine 1 (deprecated) or 2
        $this->db->exec('CREATE TABLE users (id INT NOT NULL PRIMARY KEY, name VARCHAR(255))');
        $this->db->exec('INSERT INTO users (id, name) VALUES (1, "Giorgio")');
        // $this->db will be recreated for each test method: if you have many tables, this is SLOW
        // we'll see how to adjust the teardown so that we can reuse 
        // the same schema, containing hundreds of tables, between different tests
    }

    public function testMyDatabaseIsNewShinyAndPopulatedWithData()
    {
        $this->assertTrue($this->db instanceof PDO);
        $users = $this->db->query('SELECT * FROM users')->fetchAll();
        $this->assertEquals('Giorgio', $users[0]['name']);
    }
}
  • web dev

4 hữu ích 0 bình luận 3.1k xem chia sẻ 0 bình luận 3.1k xem chia sẻ