
Ως αρχάριος στην άσκηση δοκιμή με γνώμονα την ανάπτυξη, που συχνά καταλήγουν σε δίλημμα για το πώς να πειραματική μονάδα εμμονή σε μια βάση δεδομένων.


Ξέρω ότι από τεχνική άποψη αυτό θα είναι μια δοκιμασία ενσωμάτωσης (όχι δοκιμή μονάδα), αλλά θέλω να μάθετε τις καλύτερες στρατηγικές για τα εξής:


1. ερωτήματα δοκιμών.
2. Έλεγχος ένθετα. Πώς μπορώ να ξέρω ότι το ένθετο που έχει πάει στραβά αν αποτύχει? Μπορώ να το δοκιμάσετε με την εισαγωγή και, στη συνέχεια, την αναζήτηση, αλλά πώς μπορώ να ξέρω ότι το ερώτημα δεν ήταν λάθος;
3. Δοκιμές ενημερώσεις και διαγράφει - ίδιο με ένθετα δοκιμές


Ποιες είναι οι καλύτερες πρακτικές για να κάνει αυτά;




---


Όσον αφορά SQL δοκιμές: Γνωρίζω ότι αυτό θα μπορούσε να γίνει, αλλά αν μπορώ να χρησιμοποιήσω μια Mapper O / R, όπως NHibernate, που αποδίδει κάποια κονδυλώματα ονομασία στα ψευδώνυμα που χρησιμοποιούνται για τα ερωτήματα εξόδου, και καθώς αυτό είναι κάπως απρόβλεπτη και δεν είμαι σίγουρος θα μπορούσα να δοκιμάσει γι 'αυτό.


Θα πρέπει να απλά, να εγκαταλείψει τα πάντα και απλά να εμπιστεύονται NHibernate; Δεν είμαι σίγουρος ότι είναι συνετή.

 
Πώς δοκιμή μονάδα μου επιμονή;
==============================



Κοίτα σε Μονάδα DB. Πρόκειται για μια βιβλιοθήκη της Java, αλλά πρέπει να υπάρχει ένα C # ισοδύναμο. Σας επιτρέπει να προετοιμάσει τη βάση δεδομένων με ένα σύνολο δεδομένων, έτσι ώστε να γνωρίζουμε τι είναι στη βάση δεδομένων, τότε μπορείτε να διασυνδεθούν με την DB μονάδα για να δούμε τι είναι στη βάση δεδομένων. Μπορεί να τρέξει ενάντια σε πολλά συστήματα βάσεων δεδομένων, ώστε να μπορείτε να χρησιμοποιήσετε την πραγματική ρύθμιση της βάσης δεδομένων σας, ή να χρησιμοποιήσετε κάτι άλλο, όπως HSQL σε Java (μια εφαρμογή βάσης δεδομένων Java με ένα στη μνήμη επιλογή).


Αν θέλετε να ελέγξετε ότι ο κώδικας σας χρησιμοποιεί τη βάση δεδομένων σωστά (που κατά πάσα πιθανότητα θα πρέπει να κάνει), τότε αυτό είναι ο τρόπος να πάει να απομονώσει κάθε δοκιμή και τη διασφάλιση της βάσης δεδομένων έχει τα αναμενόμενα στοιχεία προετοιμασμένοι.

 

Μπορείτε να κάνετε τη δοκιμή μονάδα κοροϊδεύοντας την σύνδεση της βάσης δεδομένων. Με αυτό τον τρόπο, μπορείτε να δημιουργήσετε σενάρια όπου συγκεκριμένα ερωτήματα στη ροή μιας κλήσης μεθόδου πετύχει ή να αποτύχει. Συνήθως οικοδομήσουμε κοροϊδεύει τις προσδοκίες μου, έτσι ώστε δεν λαμβάνεται υπόψη το πραγματικό κείμενο ερώτημα, γιατί πραγματικά θέλουν να δοκιμάσουν την ανοχή σε σφάλματα της μεθόδου και πώς η ίδια χειρίζεται - οι ιδιαιτερότητες της SQL είναι άσχετες προς το σκοπό αυτό.


Προφανώς αυτό σημαίνει ότι το τεστ δεν θα είναι πραγματικά βεβαιωθείτε ότι η μέθοδος *λειτουργεί* , επειδή η SQL μπορεί να είναι λάθος. Αυτό είναι όπου δοκιμές ολοκλήρωσης κλωτσιά στο. Γι 'αυτό, περιμένω κάποιος άλλος θα έχει μια πιο εμπεριστατωμένη απάντηση, καθώς είμαι μόλις αρχίζουν να ασχοληθούμε με αυτά τον εαυτό μου.

 

Θα ήθελα να κοροϊδεύει επίσης τη βάση δεδομένων, και βεβαιωθείτε ότι τα ερωτήματα είναι ό, τι αναμενόταν. Υπάρχει ο κίνδυνος ότι το τεστ ελέγχει το λάθος SQL, αλλά αυτό θα πρέπει να ανιχνεύεται στις δοκιμές ολοκλήρωσης

 

Το πρόβλημα που έζησα όταν επιμονή τον έλεγχο μονάδας, ειδικά χωρίς ORM και χλευάζοντας έτσι τη βάση δεδομένων σας (σύνδεσης), είναι ότι δεν ξέρω πραγματικά αν απορίες σας επιτυχία. Θα μπορούσε να είναι ότι έχετε ερωτήσεις σας έχουν σχεδιαστεί ειδικά για μια συγκεκριμένη έκδοση της βάσης δεδομένων και μόνο πετύχει με αυτήν την έκδοση. Ποτέ δεν θα το καταλάβετε αν σας κοροϊδεύουν βάση δεδομένων σας. Έτσι, κατά τη γνώμη μου, τον έλεγχο μονάδας επιμονή είναι μόνο περιορισμένης χρήσης. Θα πρέπει πάντα να προσθέσετε δοκιμές σε λειτουργία κατά τη στοχευμένη βάση δεδομένων.

 

Για `NHibernate`, θα ήθελα σίγουρα συνήγορος μόνο σκωπτική από το `NHibernate API`για τις δοκιμές μονάδα - εμπιστεύονται τη βιβλιοθήκη για να κάνουν το σωστό. Αν θέλετε να διασφαλίσετε ότι τα δεδομένα που πηγαίνει πραγματικά με την DB, κάντε μια δοκιμή ολοκλήρωσης.

 

δοκιμές μονάδα Τεχνικά της εμμονής δεν είναι δοκιμές μονάδα είναι δοκιμές ολοκλήρωσης.


Με C # χρησιμοποιώντας mbUnit, μπορείτε απλά να χρησιμοποιήσετε τα χαρακτηριστικά SqlRestoreInfo και RollBack



```
    [TestFixture]
    [SqlRestoreInfo(<connectionsting>, <name>,<backupLocation>]
    public class Tests
    {

        [SetUp]
        public void Setup()
        {

        }

        [Test]
        [RollBack]
        public void TEST()
        {
           //test insert. 
        }
    }

```

Το ίδιο μπορεί να γίνει σε NUnit, excpet τα ονόματα των χαρακτηριστικών διαφέρουν slighty.


Όσο για τον έλεγχο εάν το ερώτημά σας ήταν succeful, που κανονικά πρέπει να το ακολουθήσει με ένα δεύτερο ερώτημα για να δούμε αν η βάση δεδομένων έχει αλλάξει, όπως θα περιμένατε.

 

Έχω γράψει μια θέση εδώ σχετικά με [τον έλεγχο της μονάδας του επιπέδου δεδομένων](http://buffered.io/posts/unit-tests-boldly-crossing-boundaries-and-gently-breaking-rules/) που καλύπτει αυτό το ακριβές πρόβλημα. Συγνώμη για την (ντροπή) βύσμα, αλλά το άρθρο είναι πολύ μεγάλη για να υποβάλετε εδώ.


Ελπίζω ότι σας βοηθά - έχει λειτουργήσει πολύ καλά για μένα κατά τη διάρκεια των τελευταίων 6 μηνών για 3 ενεργά έργα.


Χαιρετισμοί,


Rob G

 

Όπως [δήλωσε ο Mike Stone](https://stackoverflow.com/questions/2046/how-do-i-unit-test-persistence#7641) , DbUnit είναι μεγάλη για να πάρει τη βάση δεδομένων σε μια γνωστή κατάσταση πριν από την εκτέλεση δοκιμών σας. Όταν ολοκληρώσετε τις δοκιμές σας, DbUnit μπορεί να θέσει τη βάση δεδομένων πίσω στην κατάσταση που ήταν πριν τελείωσε τις δοκιμές.


[DbUnit (Java)](http://www.dbunit.org/)


[DbUnit.NET](http://dbunit-net.sourceforge.net/)

 

Συνήθως δημιουργήσει ένα αποθετήριο και να τις χρησιμοποιούν για να σώσει οντότητα μου, στη συνέχεια, να ανακτήσετε νέα. Στη συνέχεια, ισχυρίζονται ότι η ανάκτηση είναι ίση με την έσωσε.

 

Για τα έργα JDBC βάση, πλαίσιο Acolyte μπορεί να χρησιμοποιηθεί: <http://acolyte.eu.org> . Επιτρέπει να κοροϊδεύω πρόσβαση στα δεδομένα που θέλετε να εξετάσεις, που επωφελούνται από JDBC αφαίρεση, χωρίς να χρειάζεται να διαχειριστεί μια συγκεκριμένη DB τεστ.

 