
اختبارات التكامل هي واحدة من مستويات
هرم الاختبار . عادة ما تتطلب المزيد من الوقت ، لأن في نفوسهم لا نستبدل أي شيء بمحاكاة مكونات حقيقية. لتقليل وقت هذه الاختبارات ، يمكننا تشغيلها بشكل متوازٍ. هنا سأتحدث بالتحديد عن مثل هذه الاختبارات لـ Postgresql.
من الناحية المثالية ، يجب أن يكون كل اختبار مستقلًا ، لذلك لن يؤثر على بعضه البعض. بمعنى آخر ، كل وظيفة اختبار لها حالتها الخاصة. هذه علامة جيدة لاستخدام الاختبارات الموازية. للحصول على مجموعة بياناتي الشخصية لكل وظيفة اختبار ، قمت بإنشاء وظيفة ، عند بدء اختبار ، تنشئ دائرة مؤقتة ، وتحمل البيانات فيها وتدمر الدائرة بعد اكتمال الاختبار. يحتوي كل
مخطط تم إنشاؤه على علامة تجزئة في الاسم لمنع تعارضات الاسم.
وظيفة المساعد
لنبدأ
بوظيفة المساعد لعرض الأخطاء في الاختبارات. أخذت وظائف مساعد بن جون (بن جونسون) ، مما ساعدني على حفظ بضعة أسطر من التعليمات البرمجية وجعل أخطائي أكثر وضوحًا وتفصيلًا.
اختبار البيانات
لتشغيل اختبار تكامل قاعدة البيانات ، يجب تقديم بيانات الاختبار. تحظى أداة Go test بدعم جيد لتحميل بيانات الاختبار من الملفات. أولا ، اذهب بناء يتخطى المجلدات تسمى "testdata". ثانياً ، عندما تقوم بتشغيل "go test" ، فإنه يغير المجلد الحالي إلى مجلد الحزمة. يتيح لك ذلك استخدام المسار النسبي لمجلد testdata لتحميل مجموعة بيانات الاختبار.
إنشاء اتصال قاعدة بيانات للاختبار
package database import ( "math/rand" "strconv" "testing" "time" _ "github.com/lib/pq" "database/sql" ) const ( dbPort = 5439 dbUser = "postgres" dbPassword = "postgres" dbName = "test" ) func CreateTestDatabase(t *testing.T) (*sql.DB, string, func()) { connectionString := fmt.Sprintf("port=%d user=%s password=%s dbname=%s sslmode=disable", dbPort, dbUser, dbPassword, dbName) db, dbErr := sql.Open("postgres", connectionString) if dbErr != nil { t.Fatalf("Fail to create database. %s", dbErr.Error()) } rand.Seed(time.Now().UnixNano()) schemaName := "test" + strconv.FormatInt(rand.Int63(), 10) _, err := db.Exec("CREATE SCHEMA " + schemaName) if err != nil { t.Fatalf("Fail to create schema. %s", err.Error()) } return db, schemaName, func() { _, err := db.Exec("DROP SCHEMA " + schemaName + " CASCADE") if err != nil { t.Fatalf("Fail to drop database. %s", err.Error()) } } }
استدعاء "CreateTestDatabase" لإنشاء اتصال بقاعدة بيانات الاختبار وإنشاء مخطط بيانات جديد للاختبارات. هذه الدالة تقوم بإرجاع اتصال قاعدة البيانات واسم المخطط الذي تم إنشاؤه ووظيفة التطهير لحذف هذا المخطط. بالنسبة للاختبار ، من الأفضل فشل الاختبار بدلاً من إرجاع خطأ للمتصل. (ملاحظة: تستند عملية إعادة النظافة إلى
اختبار Mitchell Hashimoto المتقدم مع Go talk ).
تحميل اختبار مجموعة البيانات
لقد استخدمت ملفات ".sql". يحتوي واحد (1) sql على بيانات لجدول (1) واحد. ويشمل إنشاء جدول وملء البيانات. يتم تخزين جميع ملفات sql في مجلد "testdata". هنا مثال ملف sql.
CREATE TABLE book ( title character varying(50), author character varying(50) ); INSERT INTO book VALUES ('First Book','First Author'), ('Second Book','Second Author') ;
وهنا هو الجزء المعقد. لأن كل وظيفة تعمل في نظام البيانات الفريد الخاص بها ، لا يمكننا فقط تنفيذ (كتابة) استعلام في هذه الملفات sql. يجب أن نحدد المخطط قبل أسماء الجداول من أجل إنشاء جدول أو إدراج بيانات في المخطط المؤقت المطلوب. على سبيل المثال ، يجب كتابة كتاب CREATE TABLE ... كـ CREATE TABLE uniqueschema.book ... ويتعين تغيير دفتر INSERT INTO ... إلى INSERT INTO uniqueschema.book .... اعتدت التعبيرات العادية لتعديل الاستعلامات قبل التنفيذ. إليك رمز تنزيل بيانات الاختبار:
package datalayer import ( "bufio" "fmt" "io" "os" "regexp" "testing" "database/sql" "github.com/Hendra-Huang/databaseintegrationtest/testingutil"
إنشاء اختبار
قبل البدء في كل اختبار ، سيتم إنشاء قاعدة بيانات اختبار تحمل اسمًا فريدًا للمخطط وسيتم تأجيل تنفيذ وظيفة التنظيف لحذف هذا المخطط. سيتم إدراج اسم المخطط في الطلب في الاختبار. إن أهم شيء في هذا التطبيق هو أن الاتصال بقاعدة البيانات يجب أن يكون قابلاً للتخصيص لتغيير الاتصال من قاعدة البيانات الحقيقية إلى الاتصال بقاعدة بيانات الاختبار. أضف "t.Parallel ()" في بداية كل وظيفة اختبار للإشارة إلى بيئة الاختبار الحاجة إلى تشغيل هذا الاختبار بالتوازي.
أدناه هو الكود الكامل:
ملاحظة: ضمن "TestGetBooks" ، افترض أن الاستعلام سيعود بكتابين ، كما لقد قدمت الكثير من بيانات الاختبار في "testdata / book.sql" على الرغم من وجود اختبار إدراج أعلاه. إذا لم نشارك الدائرة بين الاختبارين ، فسوف تفشل "TestGetBooks" ، لأن الآن 3 صفوف في الجدول ، 2 من الاختبار ، 1 من إدراج الاختبار أعلاه. هذه هي ميزة الدوائر المنفصلة للاختبارات - بياناتها مستقلة ، وبالتالي الاختبارات مستقلة عن بعضها البعض.مثال المشروع الذي نشرته هنا
github . يمكنك نسخه إلى نفسك ، وإجراء الاختبار ورؤية النتيجة.
استنتاج
بالنسبة لمشروعي ، يقلل هذا النهج من وقت الاختبار بنسبة 40-50 ٪ ، مقارنة بالاختبارات المتسلسلة. ميزة أخرى لتشغيل الاختبارات بشكل متوازٍ هي أنه يمكننا تجنب بعض الأخطاء التي يمكن أن تحدث عندما يعالج التطبيق العديد من الإجراءات التنافسية.
هل لديك اختبار لطيف.
- صورة من
medium.com/kongkow-it-medan/parallel-database-integration-test-on-go-application-8706b150ee2e