Notion logo

Notion QA Engineer System Design Questions

28 practice questions for Notion QA Engineer interviews

Notion QA engineer interviews test automation frameworks, test strategy, CI integration, performance testing, and debugging complex multi-service systems.

All Roles Software Engineer Backend Engineer Frontend Engineer Full Stack Engineer Mobile Engineer Data Engineer Data Scientist ML Engineer DevOps Engineer DevOps Engineer Product Manager SRE Security Engineer Engineering Manager Data Analyst UX/UI Designer QA Engineer

No verified questions yet for Notion.

system design Senior api design #1

1. [OA] API Rate Limiter — Design a system to manage API rate limiting for Notion's services

As the number of users and API calls to Notion scales, it becomes crucial to implement a rate limiting mechanism to protect services from being overwhelmed. This design must account for varying user needs and ensure fair distribution of resources.
Create an APIRateLimiter class with the following methods:
- def limit_request(self, user_id: str): Handles incoming requests for users, returning a success or wait time.
- def reset_limit(self, user_id: str): Resets the rate limit for a specific user.
- def get_user_requests(self, user_id: str) -> int: Returns the number of API calls made by a specific user in the current time window.
Example 1:
Input: limit_request('user_123')
Output: {'status': 'success', 'wait_time': 0}
Explanation: The user may proceed with their API call without waiting.
Constraints:
- Each user can make 100 requests per hour.
system design Senior api design #2

2. [OA] Load Test Orchestrator — Design a system to run load tests on Notion's API services

With the increasing number of users on Notion, a robust load testing framework is critical in ensuring that API services can handle high traffic without failures. The goals are to simulate various loads and report metrics effectively.
Implement a LoadTestOrchestrator class with the following methods:
- def run_load_test(self, service_name: str, user_count: int) -> Dict[str, Any]: Initiates a load test on a specific service and returns the outcome.
- def report_results(self, results: Dict[str, Any]) -> None: Sends the load test results to a reporting system.
- def reset_test_data(self) -> None: Clears previous test results and resets the orchestrator.
Example 1:
Input: run_load_test('api/v1/pages', 1000)
Output: {'success': True, 'response_time': 300}
Explanation: The method returns the success status and average response time based on the load test.
Constraints:
- The system should support up to 5000 concurrent users and track at least 100 metrics per test run.
system design Senior test automation #3

3. [OA] Flaky Test Detector — Design a system to identify and report flaky tests in Notion's CI pipeline

In the context of Notion’s continuous integration pipeline, flakiness can significantly impede development velocity and degrade team trust in test results. A reliable detection mechanism is essential.
Define a FlakyTestDetector class with the following methods:
- def record_test_result(self, test_id: str, success: bool) -> None: Records the result of a test execution.
- def detect_flaky_tests(self) -> List[str]: Returns a list of test IDs that are identified as flaky.
- def reset_flaky_tests(self) -> None: Resets the status of flaky tests, allowing for new evaluations.
Example 1:
Input: record_test_result('test_123', True)
Output: None
Explanation: This method adds the result into the tracking system.
Constraints:
- The system should handle up to 1000 tests and keep historical results for at least 50 test runs.

Related Notion QA Engineer interview prep

Start practicing Notion questions

Sign up for free to access walkthroughs, AI-generated questions, and more.

Get Started Free