Comparing functional and non-functional tests can be done in several ways. Functional tests focus on validating the functionality and correctness of the software, while non-functional tests measure the quality and performance of the software. The criteria for functional tests are the requirements and specifications, whereas non-functional tests use standards and benchmarks. In addition, functional tests use a black-box approach, requiring no knowledge of the internal structure or logic of the software, while non-functional tests use a white-box approach, which requires knowledge of the internal structure or logic of the software. Functional tests use tools that simulate user actions and inputs, such as Selenium, Postman, or Cucumber; conversely, non-functional tests use tools that generate load and stress, such as JMeter, LoadRunner, or Gatling. Finally, functional tests face challenges such as complex scenarios, multiple dependencies, and changing requirements; on the other hand, non-functional tests face challenges such as high resource consumption, environment configuration, and data analysis.