Οι δοκιμές ενσωμάτωσης ελέγχουν την ορθότητα της αλληλεπίδρασης μεταξύ των στοιχείων μιας εφαρμογής κινητού — μονάδων, υπηρεσιών, βάσεων δεδομένων και εξωτερικών API. Σε αντίθεση με τις μοναδιαίες δοκιμές που απομονώνουν κάθε στοιχείο, οι δοκιμές ενσωμάτωσης εντοπίζουν σφάλματα στα σημεία σύνδεσης: ασυμβατότητα μορφών δεδομένων, βλάβες κατά τη μεταφορά παραμέτρων και εσφαλμένη επεξεργασία αποκρίσεων από τον διακομιστή. Σύμφωνα με τα δεδομένα του Martin Fowler, 2018, οι δοκιμές ενσωμάτωσης καλύπτουν έως και 40% των κρίσιμων ελαττωμάτων που χάνονται από τις μοναδιαίες δοκιμές και παρέχουν εμπιστοσύνη στη σταθερότητα του συστήματος πριν από την κυκλοφορία.
Κύρια σημεία
Οι δοκιμές ενσωμάτωσης — είναι το στάδιο επαλήθευσης λογισμικού όπου αξιολογείται η ορθότητα της αλληλεπίδρασης μεταξύ των επιμέρους μονάδων ή υποσυστημάτων της εφαρμογής. Ενώ οι μοναδιαίες δοκιμές ελέγχουν κάθε στοιχείο απομονωμένα, οι δοκιμές ενσωμάτωσης συγκεντρώνουν αυτά τα στοιχεία μαζί και ελέγχουν πώς λειτουργούν σε συνδυασμό. Τυπικά σενάρια περιλαμβάνουν μεταφορά δεδομένων μεταξύ του επιπέδου δικτύου και του αποθετηρίου, εγγραφή στη βάση δεδομένων μέσω ORM και επεξεργασία αποκρίσεων από API τρίτων.
Στο πλαίσιο της ανάπτυξης εφαρμογών για κινητά, οι δοκιμές ενσωμάτωσης καλύπτουν την αλληλεπίδραση μεταξύ του επιπέδου UI, της επιχειρηματικής λογικής και των πηγών δεδομένων. Για παράδειγμα, μια δοκιμή μπορεί να ελέγξει ότι μετά το πάτημα του κουμπιού “Σύνδεση”, η εφαρμογή στέλνει αίτημα στον διακομιστή, λαμβάνει ένα token και το αποθηκεύει στην τοπική αποθήκευση. Μια τέτοια επαλήθευση επιβεβαιώνει ότι η αλυσίδα στοιχείων λειτουργεί χωρίς βλάβες.
Σύμφωνα με την έκθεση World Quality Report 2023, οι εταιρείες που εφαρμόζουν τακτικά δοκιμές ενσωμάτωσης μειώνουν τον αριθμό των περιστατικών παραγωγής κατά 35% σε σύγκριση με έργα που βασίζονται μόνο σε μοναδιαίες δοκιμές. Αυτό καθιστά τους ελέγχους ενσωμάτωσης υποχρεωτικό στοιχείο της στρατηγικής διασφάλισης ποιότητας στην εμπορική ανάπτυξη.
Οι εφαρμογές κινητών αποτελούνται από πολλά διασυνδεδεμένα στοιχεία: αιτήματα δικτύου, τοπικές βάσεις δεδομένων, ειδοποιήσεις push, υπηρεσίες συστήματος και SDK τρίτων. Κάθε ένα από αυτά τα στοιχεία αναπτύσσεται ξεχωριστά, αλλά κατά τη λειτουργία ανταλλάσσουν δεδομένα σε πραγματικό χρόνο. Οι δοκιμές ενσωμάτωσης εντοπίζουν ελαττώματα που δεν μπορούν να βρεθούν κατά τον απομονωμένο έλεγχο μονάδων.
Μεταξύ των τυπικών προβλημάτων που ανακαλύπτονται από δοκιμές ενσωμάτωσης είναι η ασυμφωνία τύπων δεδομένων μεταξύ API και μοντέλου εφαρμογής, σφάλματα σειριοποίησης JSON, εσφαλμένη επεξεργασία χρονικών ορίων δικτύου και βλάβες κατά την ταυτόχρονη πρόσβαση στη βάση δεδομένων μέσω Room ή Core Data. Χωρίς ελέγχους ενσωμάτωσης, τέτοια ελαττώματα εισχωρούν στην παραγωγή και εκδηλώνονται μόνο σε πραγματικούς χρήστες.
Η έρευνα του Google Testing Blog (2021) δείχνει ότι το κόστος επιδιόρθωσης ενός ελαττώματος που ανακαλύπτεται στο στάδιο της δοκιμής ενσωμάτωσης είναι 5 φορές χαμηλότερο από ό,τι μετά την κυκλοφορία. Αυτό εξηγείται από το γεγονός ότι στα πρώιμα στάδια, ο προγραμματιστής έχει πλήρες πλαίσιο σφάλματος και μπορεί να το διορθώσει χωρίς επείγοντα κύκλο hotfix. Η επένδυση χρόνου στη σύνταξη δοκιμών ενσωμάτωσης αποδίδει μέσω μείωσης του κόστους συντήρησης και αύξησης της εμπιστοσύνης των χρηστών.
Υπάρχουν τρεις κύριες προσεγγίσεις για την οργάνωση δοκιμών ενσωμάτωσης: Big Bang, Bottom-Up και Top-Down. Η επιλογή στρατηγικής εξαρτάται από το μέγεθος του έργου, την αρχιτεκτονική της εφαρμογής και τη διαθεσιμότητα των στοιχείων κατά τη σύνταξη των δοκιμών. Κάθε προσέγγιση έχει τα πλεονεκτήματα και τους περιορισμούς της που είναι σημαντικό να ληφθούν υπόψη κατά τον σχεδιασμό της κάλυψης δοκιμών.
Big Bang — προσέγγιση όπου όλα τα στοιχεία του συστήματος συνδέονται ταυτόχρονα, μετά την οποία εκτελείται μια γενική δοκιμαστική εκτέλεση. Αυτή η μέθοδος είναι απλή στην υλοποίηση: δεν απαιτεί σύνταξη stubs ή εξομοίωση μεμονωμένων μονάδων. Ωστόσο, κατά τον εντοπισμό σφάλματος, είναι δύσκολο να προσδιοριστεί ποιο στοιχείο είναι η πηγή του. Το Big Bang δικαιολογείται σε μικρά έργα με απλή αρχιτεκτονική, όπου ο αριθμός των μονάδων δεν υπερβαίνει τις πέντε.
Bottom-Up — στρατηγική όπου οι δοκιμές ενσωμάτωσης ξεκινούν από τα στοιχεία χαμηλού επιπέδου: βάση δεδομένων, επίπεδο δικτύου, υπηρεσίες συστήματος. Μετά τον έλεγχο κάθε επιπέδου, οι δοκιμές συνδέουν σταδιακά τις υψηλότερες μονάδες — αποθετήρια, κλάσεις Use Case και ViewModel. Το κύριο πλεονέκτημα είναι η έγκαιρη ανίχνευση ελαττωμάτων στα θεμελιώδη επίπεδα της εφαρμογής, γεγονός που μειώνει τον κίνδυνο αλληλουχικών σφαλμάτων στα μεταγενέστερα στάδια ανάπτυξης.
Top-Down — προσέγγιση όπου η δοκιμή ξεκινά από τα στοιχεία ανώτερου επιπέδου — οθόνες UI και πλοήγηση, ενώ οι χαμηλότερες μονάδες προσομοιώνονται με stubs ή mocks. Αυτό επιτρέπει τον έλεγχο σεναρίων χρήστη προτού υλοποιηθούν πλήρως το τμήμα διακομιστή ή η βάση δεδομένων. Το Top-Down είναι ιδιαίτερα χρήσιμο στην παράλληλη ανάπτυξη των τμημάτων πελάτη και διακομιστή, όταν το backend δεν είναι ακόμη έτοιμο για πραγματική ενσωμάτωση.
Για δοκιμές ενσωμάτωσης εφαρμογών κινητών χρησιμοποιείται μια σειρά εξειδικευμένων εργαλείων που χωρίζονται σε τρεις κατηγορίες: βιβλιοθήκες για εξομοίωση διακομιστών, πλαίσια για εργασία με βάσεις δεδομένων και μέσα ελέγχου υπηρεσιών συστήματος. Η επιλογή συγκεκριμένου εργαλείου εξαρτάται από την πλατφόρμα — Android ή iOS — και τη στοίβα τεχνολογίας του έργου.
Ας εξετάσουμε πρακτικά παραδείγματα δοκιμών ενσωμάτωσης για Android και iOS. Για την πλατφόρμα Android χρησιμοποιούμε MockWebServer μαζί με JUnit, για iOS — XCTest με τη βιβλιοθήκη OHHTTPStubs. Και τα δύο παραδείγματα ελέγχουν το σενάριο λήψης δεδομένων από ένα API και αποθήκευσής τους σε ένα τοπικό αποθετήριο.
Αυτή η δοκιμή ελέγχει ότι ένα αίτημα Retrofit προς τον εξομοιωμένο διακομιστή επιστρέφει σωστό JSON και το αποθετήριο μετατρέπει την απόκριση σε μοντέλο τομέα. Το MockWebServer υποκλέπτει το αίτημα και επιστρέφει το καθορισμένο JSON, μετά το οποίο η δοκιμή συγκρίνει το αναμενόμενο αποτέλεσμα με το πραγματικό.
class UserRepositoryTest {
private val mockServer = MockWebServer()
@Before
fun setup() {
mockServer.start()
}
@Test
fun fetchUser_returnsCorrectData() {
val json = "{ \`"id\`": 1, \`"name\`": \`"Alice\`" }"
mockServer.enqueue(MockResponse()
.setBody(json)
.setResponseCode(200))
val repository = UserRepository(
createRetrofit(mockServer.url("/").toString()))
val user = repository.fetchUser(1)
assertEquals(1, user.id)
assertEquals("Alice", user.name)
}
@After
fun tearDown() {
mockServer.shutdown()
}
}
Για iOS, μια παρόμοια δοκιμή χρησιμοποιεί το OHHTTPStubs για υποκλοπή αιτημάτων URL. Η βιβλιοθήκη αντικαθιστά την απόκριση του διακομιστή σε επίπεδο πλαισίου συστήματος URL Loading System, επιτρέποντας τη δοκιμή οποιασδήποτε βιβλιοθήκης δικτύου — URLSession, Alamofire ή Moya.
import XCTest
import OHHTTPStubs
import OHHTTPStubsSwift
class UserRepositoryTests: XCTestCase {
func testFetchUser_returnsCorrectData() {
stub(condition: isPath("/users/1")) { _ in
return HTTPStubsResponse(
jsonObject: ["id": 1, "name": "Alice"],
statusCode: 200,
headers: nil
)
}
let repository = UserRepository()
let expectation = expectation(description: "fetch user")
repository.fetchUser(id: 1) { user in
XCTAssertEqual(user.id, 1)
XCTAssertEqual(user.name, "Alice")
expectation.fulfill()
}
waitForExpectations(timeout: 2.0)
}
}
Η αποτελεσματική δοκιμή ενσωμάτωσης απαιτεί τήρηση μιας σειράς πρακτικών που αυξάνουν τη σταθερότητα των δοκιμών και μειώνουν το κόστος συντήρησής τους. Απομονώστε τις εξωτερικές εξαρτήσεις: χρησιμοποιήστε βάσεις δεδομένων in-memory αντί για στιγμιότυπα παραγωγής και εξομοιώστε εξωτερικά API μέσω βιβλιοθηκών δοκιμαστικών stubs. Αυτό εξαλείφει μη-ντετερμινιστικές βλάβες που προκαλούνται από τη διαθεσιμότητα δικτύου ή την κατάσταση εξωτερικών υπηρεσιών.
Διατηρήστε την ανεξαρτησία των δοκιμών: κάθε δοκιμή ενσωμάτωσης πρέπει να λειτουργεί απομονωμένα, χωρίς εξάρτηση από αποτελέσματα άλλων δοκιμών. Χρησιμοποιήστε σχολιασμούς @Before και @After στο JUnit ή setUp και tearDown στο XCTest για προετοιμασία και καθαρισμό του περιβάλλοντος δοκιμής. Αυτό αποτρέπει την αμοιβαία επίδραση των δοκιμών και απλοποιεί τη διάγνωση σφαλμάτων.
Καλύψτε οριακές περιπτώσεις: οι δοκιμές ενσωμάτωσης πρέπει να ελέγχουν όχι μόνο επιτυχή σενάρια (happy path), αλλά και τη διαχείριση σφαλμάτων — χρονικά όρια, κωδικούς HTTP 4xx και 5xx, κενές αποκρίσεις, κατεστραμμένο JSON. Σύμφωνα με δεδομένα του Google Testing Blog (2022), το 60% των περιστατικών παραγωγής σχετίζεται με εσφαλμένη διαχείριση οριακών περιπτώσεων που δεν καλύπτονταν από δοκιμές.
Συχνές ερωτήσεις
Οι μοναδιαίες δοκιμές ελέγχουν μία κλάση ή συνάρτηση απομονωμένα, αντικαθιστώντας εξαρτήσεις με stubs. Οι δοκιμές ενσωμάτωσης ελέγχουν την αλληλεπίδραση πολλών πραγματικών στοιχείων — για παράδειγμα, τη σύνδεση δικτύου και τη βάση δεδομένων ταυτόχρονα.
Η εκτέλεση δοκιμών ενσωμάτωσης συνήθως διαρκεί από 2 έως 15 λεπτά ανάλογα με τον αριθμό δοκιμών και την πολυπλοκότητα του περιβάλλοντος. Για μεγάλα έργα, συνιστάται ο διαχωρισμός των δοκιμών σε παράλληλες εργασίες στο σύστημα CI για μείωση του συνολικού χρόνου ελέγχου πριν από τη συγχώνευση.
Κατά πρώτο λόγο, οι δοκιμές ενσωμάτωσης γράφονται για το επίπεδο δικτύου, τη βάση δεδομένων και υπηρεσίες συστήματος — ειδοποιήσεις, κάμερα, γεωτοποθεσία. Τα αιτήματα API προς το backend και οι λειτουργίες με τοπική αποθήκευση δίνουν την υψηλότερη απόδοση επένδυσης, καθώς αυτά τα στοιχεία γίνονται συχνότερα πηγές παλινδρομήσεων.
Για μία οθόνη, αρκούν οι μοναδιαίες δοκιμές ViewModel και οι δοκιμές UI. Οι δοκιμές ενσωμάτωσης για μία οθόνη δικαιολογούνται μόνο εάν η οθόνη αλληλεπιδρά με πολλαπλές πηγές δεδομένων — για παράδειγμα, συνδυάζει αποκρίσεις από δύο διαφορετικά API ή γράφει δεδομένα ταυτόχρονα στο δίκτυο και στην τοπική βάση.
Οι δοκιμές ενσωμάτωσης εκτελούνται σε κάθε αίτημα pull στο pipeline CI και πριν από κύριες κυκλοφορίες. Επίσης, συνιστάται η εκτέλεση της πλήρους σειράς δοκιμών ενσωμάτωσης τη νύχτα (nightly build) για τον εντοπισμό ελαττωμάτων που σχετίζονται με αλλαγές σε εξαρτήσεις ή το περιβάλλον δοκιμής.
Σύνοψη
Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση
Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.
Διαβάστε επίσης