A significant part of the answer is in the question:
How do software platforms/frameworks test for backwards
compatibility with third party extensions?
If you have already a comprehensive test suite (for example if you use TDD), you just have to run it, and you'll have the answer.
Tests for extensibility are not much different from the other tests; it's just that you not only call framework's method, but also have tests where the framework invokes the extension:
- It requires that the test-extensions/test-budies/test-doubles need to verify that the promised pre-conditions are true (e.g. accessibility of some framework component, status of some other)
- It implies also that you have a minimum level of integration tests (e.g. hook the extension + ensure the parameters it successively receives are as expected).
The rest of the answer is to make sure your design is as SOLID as it can. In this regard, you should have a special focus on interfaces when you develop your new release, because every time you change something in an interface it might well have an impact on extensions.
P.S: do you already use semantic versioning ? It won't ensure backwards compatibility, but will inform your framework users of the level of compatibility they can expect from each new version.