From b1d07654469b25cd27a64d772491568711f77ea8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yann=20C=C3=A9bron?= Date: Thu, 10 Jun 2021 17:02:38 +0200 Subject: [PATCH] testing_faq: initial --- ijs.tree | 1 + topics/basics/testing_plugins/testing_faq.md | 67 +++++++++++++++++++ .../basics/testing_plugins/testing_plugins.md | 1 + 3 files changed, 69 insertions(+) create mode 100644 topics/basics/testing_plugins/testing_faq.md diff --git a/ijs.tree b/ijs.tree index a238a8107..18741b40c 100644 --- a/ijs.tree +++ b/ijs.tree @@ -215,6 +215,7 @@ + diff --git a/topics/basics/testing_plugins/testing_faq.md b/topics/basics/testing_plugins/testing_faq.md new file mode 100644 index 000000000..2cb64c6a7 --- /dev/null +++ b/topics/basics/testing_plugins/testing_faq.md @@ -0,0 +1,67 @@ +[//]: # (title: Testing FAQ) + + + +This page lists a number of common questions/issues and techniques useful for testing plugins. + +## Useful Classes + +- [`UsefulTestCase`](upsource:///platform/testFramework/src/com/intellij/testFramework/UsefulTestCase.java) +- [`PlatformTestUtil`](upsource:///platform/testFramework/src/com/intellij/testFramework/PlatformTestUtil.java) +- [`CodeInsightTestUtil`](upsource:///platform/testFramework/src/com/intellij/testFramework/fixtures/CodeInsightTestUtil.java) +- [`EditorTestUtil`](upsource:///platform/testFramework/src/com/intellij/testFramework/EditorTestUtil.java) +- [`PsiTestUtil`](upsource:///platform/testFramework/src/com/intellij/testFramework/PsiTestUtil.java) +- [`VfsTestUtil`](upsource:///platform/testFramework/src/com/intellij/testFramework/VfsTestUtil.java) +- [`ProjectViewTestUtil`](upsource:///platform/testFramework/src/com/intellij/testFramework/ProjectViewTestUtil.java) +- [`TestLookupElementPresentation`](upsource:///platform/testFramework/src/com/intellij/testFramework/fixtures/TestLookupElementPresentation.java) + +## Issues + +### How to avoid blinking tests? + +- Always call `super.tearDown()` inside `finally {..}` block of your test class to avoid leaks and side-effects from previously run (failed) tests. +- Avoid OS-specific assumptions (e.g., filesystem case-sensitivity, use `java.io.File.separator`). +- Use _ordered_ collections if necessary or use [`UsefulTestCase#assertUnorderedCollection()`](upsource:///platform/testFramework/src/com/intellij/testFramework/UsefulTestCase.java). +- Code deferring execution (e.g., via `Application#invokeLater()`) might not run during test execution (and possibly fails in production, too). Use `invokeLater(runnable, myProject.getDisposed()`. + +### How to avoid test failure when using resources? + +In some situations, added or changed files (e.g. DTDs provided by plugin) are not refreshed in VFS. In such cases, simply delete test-system/caches in your [sandbox directory](ide_development_instance.md#the-development-instance-sandbox-directory) and try again. + +## Techniques + +### How to mark test-only elements in production code? + +Annotate with [`org.jetbrains.annotations.TestOnly`](https://github.com/JetBrains/java-annotations/blob/master/common/src/main/java/org/jetbrains/annotations/TestOnly.java), usages will be highlighted via inspection JVM languages | Test-only usage in production code. + +### How to run tests for all files in a directory? + +Use [`FileBasedTestCaseHelper`](upsource:///platform/testFramework/src/com/intellij/testFramework/FileBasedTestCaseHelper.java), please see its javadoc for instructions. + +### How to modify setup on per-test basis? + +Use `UsefulTestCase.getTestName()` or create your own annotation(s) which can be checked via `UsefulTestCase.annotatedWith()`. + +### How to dispatch pending UI events? + +Use [`PlatformTestUtil.dispatchAllInvocationEventsInIdeEventQueue()`](upsource:///platform/testFramework/src/com/intellij/testFramework/PlatformTestUtil.java). + +### How to disable stderr logging? + +Use [`DefaultLogger.disableStderrDumping()`](upsource:///platform/util/src/com/intellij/openapi/diagnostic/DefaultLogger.java) passing `getTestRootDisposable()`. + +### How to register a resource (DTD, XSD) temporarily? + +Use `com.intellij.javaee.ExternalResourceManagerExImpl.registerResourceTemporarily()` passing `getTestRootDisposable()`. + +### How to replace component/service in tests? + +Provide `testServiceImplementation` for service declaration in plugin.xml, or use [`ServiceContainerUtil`](upsource:///platform/testFramework/src/com/intellij/testFramework/ServiceContainerUtil.kt). + +### How to wait for specified amount of time? + +Use `com.intellij.util.TimeoutUtil.sleep()`. + +### JVM: How to add Maven dependencies? + +Use [`MavenDependencyUtil`](upsource:///java/testFramework/src/com/intellij/testFramework/fixtures/MavenDependencyUtil.java). \ No newline at end of file diff --git a/topics/basics/testing_plugins/testing_plugins.md b/topics/basics/testing_plugins/testing_plugins.md index 238903074..2a7d4d237 100644 --- a/topics/basics/testing_plugins/testing_plugins.md +++ b/topics/basics/testing_plugins/testing_plugins.md @@ -35,6 +35,7 @@ Please do not use _platform/testGuiFramework_; it is reserved for internal use. * [Test Project and Testdata Directories](test_project_and_testdata_directories.md) * [Writing Tests](writing_tests.md) * [Testing Highlighting](testing_highlighting.md) +* [Testing FAQ](testing_faq.md) > Check out [this step-by-step tutorial](writing_tests_for_plugins.md) teaching how to write and run automated tests for your custom language plugin (source code included). >