Μετάβαση στο κύριο περιεχόμενο

Πώς να ελέγξετε Unity αποθηκεύσετε τις μεταναστεύσεις κατά ιστορικών καταστάσεων παίκτη

Original Persistium γράφημα μετανάστευσης που δείχνει ιστορικά σημεία ελέγχου αποθήκευσης, βήματα μετασχηματισμού, και επιθεωρημένα αποτελέσματα.

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

Ο έλεγχος του καθαρού λογαριασμού χάνει το σημαντικό ελάττωμα

Ένα νέο Unity κτίριο μπορεί να φανεί τέλειο όταν ξεκινά με ένα άδειο προφίλ. Ένας φρέσκος λογαριασμός δεν έχει συνταξιούχους πεδία, μισοτελειωμένες αναζητήσεις, cacheed αναφορές καταλόγου, παλιά stacks απογραφής, διακοπτόμενες αγορές, ή τιμές που ίσχυαν κάτω από ένα προηγούμενο σύνολο κανόνων. Ως εκ τούτου, αποδεικνύει μόνο ότι η νέα μορφή μπορεί να δημιουργήσει μια νέα κατάσταση.

Το μεταναστευτικό έργο θα πρέπει να ξεκινήσει από ένα ισχυρότερο ερώτημα: μπορεί αυτή η ακριβής ιστορική κατάσταση να εισέλθει στην τρέχουσα οικοδόμηση, να διατηρήσει το νόημα που εξακολουθεί να έχει σημασία, και είτε να γίνει έγκυρη τρέχουσα κατάσταση ή να αποτύχει με έναν τρόπο που είναι χρήσιμο για τη διάγνωση; Αυτό είναι ένα ερώτημα προϊόντος τόσο όσο μια ερώτηση serializer. Ένα πεδίο μπορεί να αποστερηθεί επιτυχώς, ενώ εξακολουθεί να παραβιάζει έναν κανόνα εξέλιξης, επισημαίνοντας το χαμένο περιεχόμενο, ή αλλάζοντας ένα δικαίωμα αγοράς. Φόρτωση bytes δεν είναι αρκετό.

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

Χτίστε ένα ιστορικό κρατικό σώμα

Κάθε fixture χρειάζεται ένα σταθερό αναγνωριστικό, η έκδοση που το παρήγαγε, μια σύντομη ετικέτα σεναρίου, μια δήλωση μορφής, και μια ταξινόμηση απορρήτου. Το σενάριο ετικέτα έχει σημασία επειδή μια σουίτα μετανάστευσης θα πρέπει να περιλαμβάνει σημαντικές καταστάσεις, όχι μόνο τυχαία JSON. Παραδείγματα περιλαμβάνουν έναν νέο παίκτη, έναν παίκτη σε ένα όριο κεφαλαίου, μια απογραφή στο όριο στοίβας του, ένα διακοπτόμενο φροντιστήριο, μια παλιά ανταμοιβή γεγονότος, ένα χρήστη με προαιρετικό περιεχόμενο καλλυντικών, και ένα προφίλ που σκόπιμα περιέχει ένα άκυρο συνδυασμό κληρονομιάς.

Χρησιμοποιήστε αμετάβλητα αντίγραφα εργασίας. Ο δρομέας δοκιμών δεν θα πρέπει ποτέ να αντικαταστήσει την πηγή fixture κατά την προσπάθεια μετάβασης. Αντιγραφή του fixture σε έναν προσωρινό κατάλογο εργασίας, καταγράψτε το checksum ή το hash περιεχομένου, εκτελέστε τον προσαρμογέα, και να διατηρήσει την παραγόμενη έξοδο ξεχωριστά. Αυτό μετατρέπει ένα εκπληκτικό αποτέλεσμα σε στοιχεία που μπορεί να αναπαράγει κάποιος άλλος. Επίσης, εμποδίζει μια δοκιμή από την αθόρυβη βελτίωση της δικής του εισόδου μέχρι να εξαφανιστεί το αρχικό πρόβλημα.

Κρατήστε τα δεδομένα παικτών από το περιβάλλον παραγωγής εκτός ενός γενικού καταλόγου δεδομένων δοκιμών ανάπτυξης. Ένα ιστορικό σύνολο δεδομένων μπορεί να είναι συνθετικό, να χρησιμοποιείται με συγκατάθεση, να έχει υποστεί προσεκτική απόκρυψη ευαίσθητων στοιχείων ή να έχει παραχθεί από ντετερμινιστικά σενάρια. Το βασικό είναι να διατηρεί τις δομικές και σημασιολογικές οριακές περιπτώσεις που έχουν σημασία. Το απόρρητο δεν είναι δευτερεύον ζήτημα: αφαιρέστε άμεσα αναγνωριστικά, αναγνωριστικά συσκευών, στοιχεία επικοινωνίας, διακριτικά πληρωμών, ακατέργαστες αποδείξεις και μυστικά πριν ένα σύνολο δεδομένων δοκιμών γίνει ευρέως προσβάσιμο.

Σχεδίαση του γραφήματος μετάβασης πριν από την εγγραφή ενός μετατροπέα

Οι αριθμοί έκδοσης δεν είναι ένα σχέδιο μετάβασης. Ένα παιχνίδι μπορεί να μετακινηθεί από 1 σε 2, 2 σε 3, και 3 σε 4, στη συνέχεια να συναντήσει έναν παίκτη που έχει παρακάμψει απευθείας από 1 σε 4. Μπορεί να στείλει ένα hotfix που αλλάζει μόνο ένα φωλιασμένο αρχείο απογραφής, ή να αποσύρει ένα πεδίο που το παλιό περιεχόμενο εξακολουθεί να αναμένει. Ένα γράφημα κάνει αυτές τις επιλογές ορατές: κάθε κόμβος είναι ένα save σχήμα ή σημασιολογική έκδοση; κάθε άκρη είναι μια ρητή μεταμόρφωση ή μια σκόπιμη απόρριψη; κάθε άκρη έχει προϋποθέσεις και μετά προϋποθέσεις.

Για κάθε υποστηριζόμενη έκδοση έναρξης, αποφασίστε αν οι αλυσίδες παιχνιδιών που βρίσκονται δίπλα μεταμορφώνονται, χρησιμοποιεί ένα άμεσο transform, ή απαιτεί μια αναβάθμιση πλευρά υπηρεσίας πριν από τα φορτία του πελάτη. Μην αφήνετε παραλείψει εκδόσεις σε ό, τι συμβαίνει όταν τα πεδία είναι απόντα. Μια αλυσίδα μπορεί να είναι ασφαλέστερη όταν κάθε βήμα είναι μικρό και δοκιμαστεί. Μια άμεση transform μπορεί να είναι ασφαλέστερη όταν οι ενδιάμεσες μορφές δεν είχαν ποτέ σκοπό να είναι παρατηρήσιμες. Και οι δύο προσεγγίσεις χρειάζονται σαφή ιδιοκτησία και επαναλαμβανόμενα εξαρτήματα.

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

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

Κάντε παρατηρήσιμα τα ταξίδια στρογγυλής φόρτωσης

Μόλις ένα fixture εισέλθει στο μονοπάτι της μετανάστευσης, εκτελέστε ένα πλήρες ταξίδι γύρου: φορτώστε την ιστορική είσοδο, μεταναστεύστε το, κατασκευάστε το μοντέλο του παιχνιδιού, αποθηκεύστε το χρησιμοποιώντας τον τρέχοντα συγγραφέα, στη συνέχεια φορτώστε το ρεύμα εξόδου και πάλι. Το πρώτο φορτίο ελέγχει αν ένα ιστορικό αρχείο μπορεί να εισέλθει στο σύστημα. Το δεύτερο φορτίο ελέγχει αν ο σημερινός συγγραφέας δημιούργησε ένα σταθερό, αυτοσυντηρούμενο αποτέλεσμα. Συγκρίνετε την κατάσταση μετά το πρώτο και το δεύτερο φορτίο σύμφωνα με τους σημασιακούς κανόνες, όχι μόνο την ωμή ισότητα byte.

Η ωμή ισότητα είναι συχνά ο εσφαλμένος ισχυρισμός. Νέες προεπιλογές μπορεί να προστεθούν, η τάξη πεδίου μπορεί να αλλάξει, οι χρονοσφραγίδες μπορεί να ανανεωθούν, και οι συλλογές μπορεί να λάβουν σταθερή παραγγελία. Καθορίστε έναν κανονικοποιητή για τιμές που είναι σκόπιμα μη-σημαντικές, στη συνέχεια, συγκρίνουν τα υπόλοιπα. Ο ίδιος ο κανονικοποιητής αξίζει αναθεώρηση? δεν πρέπει να γίνει μια κουβέρτα αγνοούν λίστα που κρύβει πραγματική απώλεια. Μια καλή έκθεση σύγκρισης που τα πεδία προστέθηκαν, αφαιρέθηκαν, μετασχηματίστηκαν, ή σκόπιμα αγνοήθηκαν.

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

Εξπρές αμετάβλητες ειδικές για το παιχνίδι

Το παιχνίδι πρέπει να παρέχει τα δικά του αμετάβλητα. Γράψτε τα στη γλώσσα που συνδέεται με τα αποτελέσματα του παίκτη: ένα επίπεδο είναι εντός του τρέχοντος εύρους· μια ποσότητα αποθέματος είναι μη αρνητική και οριοθετημένη· κάθε ιδιοκτησιακό αντικείμενο έχει έναν γνωστό ορισμό ή μια ρητή κληρονομιά fallback? ένα ολοκληρωμένο tutorial παραμένει ολοκληρωθεί? νόμισμα είναι πεπερασμένο? μια αναφορά αναζήτησης ανήκει σε έναν τρέχοντα κατάλογο? ένα δικαίωμα είναι μοναδικό? ένας παγκόσμιος σπόρος και δημιουργήθηκε το παγκόσμιο κράτος συμφωνούν.

Χωριστά αναλλοίωτα σε στρώματα. Δομικά αναλλοίωτα απαντούν αν υπάρχουν τα απαιτούμενα πεδία και τύποι. Αναφορικά αναλλοίωτα απαντούν αν τα ID δείχνουν γνωστούς ορισμούς. Τα χωρικά αναλλοίωτα απαντούν αν οι τιμές υπακούουν στους κανόνες του παιχνιδιού. Τα αναλλοίωτα της ασφάλειας απαντούν αν τα δεδομένα είναι πεπερασμένα, οριοθετημένα και ασφαλή για εμφάνιση. Όταν ένα fixture αποτυγχάνει, το στρώμα λέει στην ομάδα αν χρειάζεται αλλαγή σειριακού μετατροπέα, προσαρμογέα καταλόγου, απόφαση κανόνων, ή πολιτική ανάκτησης.

Ξεκινήστε από ένα γνωστό fixture και σκόπιμα αφαιρέστε ένα πεδίο, αναπαραγάγετε ένα αναγνωριστικό απογραφής, αντικαταστήστε μια αναφορά καταλόγου, παραλείψτε μια έκδοση, αναδιάταξε μια λίστα δράσης, ή να αλλάξετε μια ποσότητα ορίων. Κάθε μετάλλαξη θα πρέπει να έχει ένα αναμενόμενο αποτέλεσμα: μεταναστεύουν με μια τεκμηριωμένη προεπιλογή, απορρίπτονται με μια διαγνωστική κατηγορία, καραντίνα για την ανάκτηση, ή απαιτούν μια επισκευή δεδομένων εγκεκριμένο από τον ιδιοκτήτη. “Δεν συντρίβεται” δεν είναι ένα επαρκές αναμενόμενο αποτέλεσμα.

Μείωση μιας αποτυχημένης αποθήκευσης χωρίς απώλεια του σφάλματος

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

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

Η μείωση απαιτεί αναπαραγωγιμότητα. Κλειδώστε το fixture hash, την έκδοση μετάβασης, την έκδοση προσαρμογέα, τον ντετερμινιστικό σπόρο, το σχετικό στιγμιότυπο ρύθμισης, και το αναμενόμενο αμετάβλητο. Αν το περιβάλλον αλλάζει κατά τη διάρκεια κάθε προσπάθειας, ένας μειωτής μπορεί να παράγει μια μικρότερη κατάσταση για διαφορετικό πρόβλημα. Κρατήστε ένα δηλωτικό επανάληψης με αυτές τις εισόδους και το παρατηρούμενο αποτέλεσμα. Η έξοδος δεν είναι απλώς ένα μικρότερο αρχείο, είναι μια περίπτωση παλινδρόμησης που μπορεί να εκτελέσει κάποιος άλλος.

Δώστε σε κάθε fixture ένα σταθερό όνομα, μια σύντομη εξήγηση της αποτυχίας, το αμετάβλητο που διατηρεί, και μια αναμενόμενη ταξινόμηση. Μια fixture παλινδρόμησης είναι πολύτιμη, επειδή κάνει ένα προηγούμενο εκπληκτικό όριο ρουτίνας. Δεν πρέπει να γίνει μια κρυφή πηγή δεδομένων παίκτη παραγωγής ή ένα catch-all για ανεξήγητες αποτυχίες.

Βάλτε την πρόβα στο CI χωρίς να το κάνετε θορυβώδες

Εκτελέστε ένα γρήγορο αντιπροσωπευτικό υποσύνολο σε κάθε σχετική αλλαγή: τρέχουσες ακμές μετανάστευσης, υψηλού κινδύνου ιστορικές καταστάσεις, και ένα μικρό σύνολο ντετερμινιστικών μεταλλάξεων. Εκτελέστε το πλήρες corpus σε μια προγραμματισμένη εργασία, υποψήφιος απελευθέρωσης, ή αλλαγή που αγγίζει τη σειριακότητα, την εξέλιξη, την ερμηνεία καταλόγου, το συγχρονισμό σύννεφο, ή save-format κώδικα.

Η CI έξοδος θα πρέπει να είναι συνοπτική αλλά επιθεωρήσιμη. Αναφέρετε το fixture ID, τις εκδόσεις έναρξης και στόχου, το άκρο μετάβασης, το αμετάβλητο στρώμα, το πρώτο άκυρο σημείο ελέγχου, και μια διαδρομή προς το redacted τεχνούργημα ή diff. Αποφύγετε την εκτύπωση πλήρη περιεχόμενα προφίλ σε κορμούς. Όταν μια αποτυχία είναι νέα, διατηρεί τις ελάχιστες πληροφορίες που απαιτούνται για να αναπαράγει τοπικά? όταν αναμένεται, καταγράψτε ότι η ταξινόμηση έτσι ώστε μια απελευθέρωση δεν εξομαλύνει σιωπηλά έναν γνωστό κίνδυνο.

Η απόφαση απελευθέρωσης θα πρέπει να αναφέρει τι σημαίνει τα αποδεικτικά στοιχεία. Περνώντας τα τεστ μετανάστευσης υποστηρίζουν έναν καθορισμένο ισχυρισμό: το δοκιμασμένο corpus και δηλωμένες διαδρομές συμπεριφέρθηκαν όπως αναμενόταν σε αυτό το περιβάλλον. Δεν αποδεικνύουν ότι κάθε παίκτης αποθηκεύουν, συσκευή, ή εξωτερική υπηρεσία θα συμπεριφέρονται πανομοιότυπα. Ομάδες εξακολουθούν να χρειάζονται σχέδια αναστροφής, χειρισμό υποστήριξης πελατών, και παρακολούθηση που σέβονται την ιδιωτικότητα.

Πρακτικός κατάλογος ελέγχου

  • Διατηρήστε μια έκδοση ιστορικό corpus με ετικέτες σεναρίων και ταξινομήσεις απορρήτου.
  • Αντιγραφή εισροών πριν τη μετανάστευση και διατήρηση hashes για την πηγή και την έξοδο τεχνουργήματα.
  • Σχεδίαση υποστηριζόμενων άκρων μετανάστευσης, συμπεριλαμβανομένης της πολιτικής παραλείψεων-έκδοσης και σαφείς απορρίψεις.
  • Επιβεβαιώστε δομικές, σχετικές, domain, και αμετάβλητες ασφάλειας μετά από κάθε σημείο ελέγχου.
  • Το ταξίδι μετετράπη μέσω του τρέχοντος συγγραφέα και αναγνώστη.
  • Χρησιμοποιήστε ντετερμινιστικές μεταλλάξεις για να ελέγξετε τα ελλείποντα πεδία, τα διπλά αρχεία, το συνταξιούχο περιεχόμενο, και τις οριακές τιμές.
  • Μειώστε τις αναπαραγώγιμες αποτυχίες σε αναθεωρημένες διατάξεις παλινδρόμησης με δηλωτικά επανάληψης.
  • Εκτελέστε υποσύνολα εστιασμένα στον κίνδυνο συνεχώς και το πλήρες corpus πριν από την απελευθέρωση-ευαίσθητες αλλαγές.
  • Κρατήστε τα αρχεία καταγραφής και τα αντικείμενα που διαγράφονται· μην μετατρέψετε το CI σε αρχείο δεδομένων παίκτη.

Συχνές ερωτήσεις

Χρειαζόμαστε πραγματικές οικονομίες για να ελέγξουμε τη μετανάστευση;

Όχι. Τα πραγματικά ιστορικά σχήματα είναι χρήσιμα, αλλά το corpus μπορεί να συνθετικά ή προσεκτικά να επαναδιατυπωθεί. Αυτό που έχει σημασία είναι η διατήρηση των δύσκολων συνδυασμών κατάσταση: συνταξιούχο περιεχόμενο, μακρά εξέλιξη, διακοπτόμενες μεταβάσεις, προαιρετικά δεδομένα, και τιμές σε σημαντικά όρια. Αν τα δεδομένα παραγωγής χρησιμοποιούνται για να ανακαλύψετε μια περίπτωση άκρη, να αντλήσετε ένα ασφαλές fixture που διατηρεί μόνο την ιδιότητα υπό δοκιμή.

Θα πρέπει κάθε παλιά έκδοση να υποστηρίζεται για πάντα;

Όχι απαραίτητα. Η υποστήριξη είναι προϊόν και λειτουργική απόφαση. Το σημαντικό είναι να γίνει το όριο σαφές: ποιες εκδόσεις μεταναστεύουν, οι οποίες απαιτούν μια προηγούμενη ενημέρωση, οι οποίες απορρίπτονται, και πώς ενημερώνεται ο παίκτης. Μια μη τεκμηριωμένη τυχαία διαδρομή είναι η λιγότερο ασφαλής επιλογή επειδή δεν υποστηρίζεται αξιόπιστα ούτε απορρίπτεται σαφώς.

Μπορεί ένας σειριακός test να αντικαταστήσει τα τεστ παιχνιδιού;

Όχι. Οι δοκιμές Serializer αποδεικνύουν ότι τα δεδομένα μπορούν να διαβαστούν και να γραφτούν σύμφωνα με τα δηλωμένα σχήματα. Τα gameplay και domain tests αποδεικνύουν ότι η κατάσταση που προκύπτει έχει νόημα στο τρέχον σύνολο κανόνων. Μια ισχυρή πρόβα μετανάστευσης χρειάζεται τόσο, καθώς και μια αναθεώρηση του περιεχομένου και των αναφορών διαμόρφωσης που επηρεάζουν το νόημα των αποθηκευμένων τιμών.

Ποιος είναι ο ρόλος του Persistium εδώ;

Η Persistium είναι μια in-development τοπική-πρώτη οικογένεια προϊόντων αξιοπιστίας. Η καθοδήγηση σε αυτό το σημείωμα είναι πρακτική μηχανική συμβουλές, δεν είναι ένας ισχυρισμός ότι ένα δημόσιο προϊόν Persistium είναι διαθέσιμο ή ότι έχει διαγνωστεί πραγματικά δεδομένα πελατών.

Σχετικό σύστημαΕξερευνήστε το Persistium