Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

डेटाबेस प्रश्नों में शामिल विधियों की जांच के लिए परीक्षण संचालित विकास

कुछ समय पहले मेरे अपने कुछ परीक्षणों को पुन:सक्रिय करते समय मेरा भी ऐसा ही एक प्रश्न था, और आप इसे कुछ तरीकों से कर सकते हैं:

ए) एक निर्यातित प्रकार और एक Open प्रदान करें या Connect फ़ंक्शन जो इसे लौटाता है - उदा.

type DB struct {
    db *sql.DB
}

// Using http://jmoiron.github.io/sqlx/ for this example, but
// it has the same interface as database/sql
func Open(opts *Options) (*DB, error) {
    db, err := sqlx.Connect(opts.Driver, fmt.Sprintf("host=%s user=%s dbname=%s sslmode=%s", opts.Host, opts.User, opts.Name, opts.SSL))
    if err != nil {
        return nil, err
    }

    return &DB{db}, nil
}

... और फिर आपका प्रत्येक परीक्षण, सेटअप और टियरडाउन फ़ंक्शन लिखें जो *DB . का एक उदाहरण लौटाते हैं कि आप अपने डेटाबेस फ़ंक्शंस को परिभाषित करते हैं (विधियों के रूप में - यानी func (db *DB) GetUser(user *User) (bool, error) ):

// Setup the test environment.
func setup() (*DB, error) {
    err := withTestDB()
    if err != nil {
        return nil, err
    }

    // testOptions is a global in this case, but you could easily
    // create one per-test
    db, err := Open(testOptions)
    if err != nil {
        return nil, err
    }

    // Loads our test schema
    db.MustLoad()
    return db, nil
}

// Create our test database.
func withTestDB() error {
    db, err := open()
    if err != nil {
        return err
    }
    defer db.Close()

    _, err = db.Exec(fmt.Sprintf("CREATE DATABASE %s;", testOptions.Name))
    if err != nil {
        return err
    }

    return nil
}

ध्यान दें कि यह कुछ हद तक "एकीकरण" परीक्षण है, लेकिन मैं दृढ़ता से "वास्तविक" डेटाबेस के खिलाफ परीक्षण करना पसंद करता हूं क्योंकि इंटरफ़ेस का मजाक उड़ाने से आपको अपने प्रश्नों/क्वेरी सिंटैक्स के साथ समस्याओं को पकड़ने में मदद नहीं मिलेगी।

बी) विकल्प, हालांकि आवेदन पक्ष पर कम एक्स्टेंसिबल है, वैश्विक db *sql.DB होना है वेरिएबल जिसे आप init() . में इनिशियलाइज़ करते हैं आपके परीक्षणों के भीतर—चूंकि परीक्षणों का कोई गारंटीकृत आदेश नहीं है, आपको init() . का उपयोग करने की आवश्यकता होगी —और फिर वहां से अपने परीक्षण चलाएं। यानी

var db *sql.DB

func init() {
    var err error
    // Note the = and *not* the assignment - we don't want to shadow our global
    db, err = sqlx.Connect(...)
    if err != nil {
        ...
    }

    err := db.loadTestSchema
    // etc.
}

func TestGetUser(t *testing.T) {
   user := User{}
   exists, err := db.GetUser(user)
   ...
}

आपको कुछ व्यावहारिक उदाहरण drone.io के GitHub रेपो , और मैं Go एप्लिकेशन की संरचना पर यह लेख (विशेषकर डीबी सामान)।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL:उन पंक्तियों का चयन करना जहाँ स्तंभ मान पिछली पंक्ति से बदल गया है

  2. MySQL में UNION का उपयोग करते समय "ERROR 1054 (42S22):'ऑर्डर क्लॉज" में अज्ञात कॉलम '...' को ठीक करें

  3. पुनरावर्ती MySql ट्रिगर काम नहीं कर रहा

  4. PHP 7.2.2 + mysql 8.0 PDO देता है:क्लाइंट के लिए अज्ञात प्रमाणीकरण विधि [caching_sha2_password]

  5. एक बार में सभी टेबल की मरम्मत करें