Automatyczne testowanie (IT)Inżynier QA Automatyzacji

Opracuj zautomatyzowany framework walidacji dla żądań usunięcia "prawa do bycia zapomnianym" zgodnie z RODO w rozproszonych mikroserwisach, zapewniając weryfikację usunięcia kryptograficznego, niezmienność śladów audytu i zgodność z integralnością referencyjną poprzez relacje klucza obcego, jednocześnie utrzymując izolację testów?

Zdaj rozmowy kwalifikacyjne z asystentem AI Hintsage

Historia pytania

Wraz z RODO, CCPA i podobnymi regulacjami dotyczącymi prywatności, organizacje stają przed prawnymi wymaganiami udowodnienia całkowitego usunięcia danych osobowych na żądanie użytkownika. Tradycyjne podejścia do QA koncentrowały się na poprawności funkcjonalnej — weryfikując, że API zwraca HTTP 200 — zamiast fizycznej nieobecności danych. Historyczne procesy audytu manualnego wymagały dni inspekcji baz danych i nie mogły się skalować wraz z prędkością CI/CD. Ewolucja w stronę architektur mikroserwisowych jeszcze bardziej to skomplikowała, ponieważ dane fragmentowały się w dziesiątkach usług z modelami końcowej spójności, co czyniło naiwne testy usunięcia niewystarczającymi dla zapewnienia zgodności.

Problem

W systemach rozproszonych, PII (Dane Osobowe) propagują się w instancjach PostgreSQL, klastrach MongoDB, pamięciach podręcznych Redis, indeksach Elasticsearch i strumieniach Kafka złożonymi relacjami kluczy obcych. Proste testowanie odpowiedzi API pozostawia orphans referencje w tabelach dziecięcych, przestarzałe wpisy w pamięci podręcznej i soft-deleted rekordy, które pozostają do odzyskania. Ponadto, ślady audytowe muszą pozostawać niezmienne dla zgodności prawnej, nie zawierając żadnych identyfikowalnych danych użytkowników. Testowanie musi weryfikować usunięcie kryptograficzne — dowodząc, że dane są nieodwracalne bez klucza szyfrującego — podczas obsługi warunków wyścigu, w których usługi asynchroniczne mogą odtworzyć usunięte rekordy z wiadomości w kolejce.

Rozwiązanie

Zaimplementuj framework walidacji usunięcia opartej na umowach używając Testcontainers, aby zainstalować ephemeralne topologie podobne do produkcyjnych dla każdego testu. Framework wstrzykuje syntetyczne PII oznaczone kryptograficznymi odciskami palców (hashe SHA-256 unikalnych identyfikatorów), uruchamia proces usunięcia, a następnie wykonuje bezpośrednie zapytania do wszystkich warstw utrwalania, aby stwierdzić fizyczną nieobecność. W przypadku śladów audytowych, zaimplementuj tokenizację, gdzie dzienniki przechowują jedynie nieodwracalne hashe wskazujące na zbiory danych. Użyj wzorców orchestracji Sagi, aby uszanować zamówienie usuwania integralności referencyjnej (dzieci przed rodzicami) i weryfikować usunięcie klucza KMS dla usunięcia kryptograficznego. Testy są uruchamiane jako izolowane transakcje, które automatycznie wycofują lub niszczą kontenery po walidacji.


Odpowiedź na pytanie

Framework wymaga trzech warstw architektonicznych: Wstrzykiwanie Danych, Weryfikacja Orkiestracji oraz Potwierdzenie Kryptograficzne. Po pierwsze, stwórz serwis Data Seeder, który generuje syntetyczne profile użytkowników z znanymi odciskami palców i wstrzykuje je we wszystkich mikroserwisach za pośrednictwem publicznych API. Po drugie, Weryfikator Orkiestru wykonuje żądanie usunięcia, monitorując tematy Kafka w poszukiwaniu markerów grobów, zapewniając, że usługi przetwarzają usunięcia w porządku topologicznym, aby zapobiec naruszeniom klucza obcego. Po trzecie, Silnik Potwierdzający wykonuje weryfikację po wykonaniu, wysyłając zapytania bezpośrednio do baz danych przez sterowniki JDBC/ODBC, sprawdzając klucze Redis pod kątem wygaśnięcia i potwierdzając, że materiał klucza AWS KMS jest zaplanowany do zniszczenia w wymaganym 7-dniowym okresie przejściowym.

W przypadku śladów audytowych wdrożono odsłonowe odniesienie: zamiast przechowywać adresy e-mail w dziennikach, przechowuj hashe HMAC-SHA256. Podczas testowania usunięcia, weryfikuj, że hash już nie rozwiązuje się na dane w skarbcu, podczas gdy wpis w dzienniku pozostaje nienaruszony. To jednocześnie spełnia wymagania dotyczące niezmienności i prywatności.


Sytuacja z życia

Opis problemu: Na platformie SaaS w sektorze zdrowia obsługującej pacjentów z UE, mieliśmy do czynienia z audytem regulacyjnym, który wymagał zautomatyzowanego dowodu, że żądania usunięcia trwale usunęły dane z 15 mikroserwisów, w tym sharded klastra MongoDB z danymi pacjentów, bazy danych PostgreSQL z harmonogramem wizyt zawierającym ograniczenia kluczy obcych oraz indeksu Elasticsearch do wyszukiwania historii medycznej.

Pierwsze rozważane rozwiązanie: Testowanie integracyjne w wspólnym środowisku stagingowym z kopiowanymi danymi produkcyjnymi. Zalety: Realistyczne wolumeny danych i relacje. Wady: Testy zajmowały 6 godzin, naruszały przepisy dotyczące miejsca przechowywania danych, ponieważ testerzy mogli widzieć prawdziwe PHI (Chronione Informacje Zdrowotne) i miały niestabilne wyniki z powodu zanieczyszczenia danych testowych z innych zespołów. Odrzuciliśmy to, ponieważ blokowało to pipeline CI/CD i stwarzało ryzyko zgodności.

Drugie rozważane rozwiązanie: Testy jednostkowe z udawanymi odpowiedziami bazy danych. Zalety: Wykonywały się w 30 sekund i nie wymagały infrastruktury. Wady: Tylko potwierdzano, że serwis wywołuje deleteById(); nie można było wykryć pozostałych PII w indeksach Elasticsearch soft-deletion, orphans wizyt w tabelach dziecięcych PostgreSQL ani wpisów w pamięci podręcznej Redis, które utrzymywały się przez 24 godziny. To zapewniło mylącą pewność i nie wykryło krytycznej usterki, w której rekordy medyczne pozostały do przeszukiwania.

Wybrane rozwiązanie: Zbudowaliśmy Kontenerowy Weryfikator Zgodności przy użyciu Docker Compose, aby uruchomić izolowane instancje PostgreSQL, MongoDB, Redis i Elasticsearch na każdą egzekucję testu. Każdy test generował syntetyczne dane pacjentów z odciskami palców opartymi na UUID, wykonano API usunięcia, a następnie użyto bezpośrednich sterowników baz danych, aby potwierdzić zero pozostałych danych. Wybraliśmy to, ponieważ zapewniało deterministyczną izolację (równoległe testy nigdy się nie kolidowały), weryfikowano rzeczywisty stan przechowywania zamiast logiki aplikacji i kończono w 12 minut — wystarczająco szybko dla bram CI, jednocześnie spełniając wymagania audytorów, że testowaliśmy faktyczny stos infrastruktury.

Wynik: Framework zidentyfikował 4 krytyczne luki w zgodności: brak ograniczenia ON DELETE CASCADE, co powodowało orphans rekordy wizyt, indeks Elasticsearch, który używał markerów soft-delete, które można odzyskać przez API administracyjne, pamięć podręczna Redis TTL, która przekraczała prawne 30-dniowe ograniczenie przechowywania danych, oraz dzienniki audytu przechowujące surowe imiona pacjentów zamiast tokenizowanych hashy. Osiągnęliśmy zero ustaleń w naszym audycie RODO i zmniejszyliśmy czas testowania zgodności z 3 dni do zautomatyzowanych 12-minutowych bram.


Co często umyka kandydatom

Pytanie 1: Jak weryfikujesz, że dane są kryptograficznie usunięte, a nie tylko logicznie oznaczone jako usunięte, gdy używasz wzorców soft-delete ORM typowych dla frameworków takich jak Django czy Hibernate?

Wielu kandydatów sugeruje sprawdzanie znacznika czasu deleted_at lub flagi is_active. To nie jest poprawne, ponieważ dane pozostają fizycznie obecne na dysku i odzyskiwalne przez zrzuty baz danych lub analizę WAL (Write-Ahead Log). Prawidłowe podejście polega na weryfikacji kryptograficznego usunięcia: stwierdzenie, że klucze szyfrujące specyficzne dla danych użytkownika zostały zniszczone w AWS KMS lub Azure Key Vault, co sprawia, że ciphertext jest trwale nieodwracalny. Dla implementacji soft-delete, musisz wymusić natychmiastowe operacje VACUUM w PostgreSQL lub operacje compact w MongoDB, aby odzyskać pamięć, a następnie zweryfikować bezpośrednią analizą hexdump plików bazy danych lub inspekcją indeksu, że konkretne strony danych już nie zawierają oryginalnych wartości.

Pytanie 2: Jakie strategie zapobiegają naruszeniom ograniczeń klucza obcego podczas usuwania rekordów rodziców w mikroserwisach, gdzie dane dzieci znajdują się w różnych usługach z końcową spójnością?

Kandydaci często pomijają wzorzec Saga z kolejnością topologiczną. Proste uruchamianie asynchronicznych zdarzeń usunięcia prowadzi do naruszeń ograniczeń, jeśli usługa dziecięca przetwarza wolno lub chwilowo się wyłącza. Prawidłowe rozwiązanie wdraża Orkiestrator Usunięcia, który rozumie graf domeny: najpierw wyłącza kontrole klucza obcego lub używa opóźnionych ograniczeń (w PostgreSQL: SET CONSTRAINTS ALL DEFERRED), usuwa węzły liściowe (dzieci) w usługach posiadających dane, weryfikując każde usunięcie poprzez synchroniczne kontrole stanu, a następnie przechodzi do rekordów rodziców. Testowanie tego wymaga symulowania partycji w sieci między usługami, aby zapewnić, że transakcje kompensacyjne przywracają dane, jeśli częściowe usunięcie nie powiedzie się, zapobiegając wiszącym referencjom, które naruszają integralność referencyjną.

Pytanie 3: Jak utrzymujesz izolację testów podczas weryfikacji usunięcia śladów audytowych, które są prawnie wymagane do pozostania niezmiennymi dla celów zgodności?

Ta paradoks stawia w trudnej sytuacji wielu kandydatów. Rozwiązaniem jest tokenizacja PII z odsłonowym odniesieniem. Dziennik audytu musi pozostawać tylko do dopisywania i niezmienny, przechowując jedynie kryptograficzne hashe (np. SHA-256 z solą) danych osobowych, a nie same dane. Podczas testowania usunięcia, wstrzykujesz syntetyczne dane, gdzie kontrolujesz wartości hash. Po uruchomieniu usunięcia, weryfikujesz, że hash w śladzie audytu już nie rozwiązuje się na jakiekolwiek dane w Token Vault (osobny mikroserwis przechowujący rzeczywiste powiązania), jednocześnie potwierdzając, że wpis audytu pozostaje niezmieniony z oznaczeniem grobu takim jak [DANE USUNIĘTE]. To jednocześnie spełnia wymagania dotyczące prawnej niezmienności (sekwencja zdarzeń jest zachowana) i mandaty dotyczące prywatności (rzeczywista tożsamość jest nieodwracalna).