Even if the inheritance approach was not blocked by the static
method declarations, composition is arguably a better way to go - see e.g.
Composition vs Inheritance and many other discussions.
You can create separate classes that you create and invoke from your static test methods to do various aspects of the work. If these classes are shared between test classes, you can make them top-level classes or if they are relevant to only one test class you can make them nested classes of the test class. These classes can use various designs, from just being simple holders of constants, to patterns such as the builder pattern. Both data setup and assertion methods can be added.
Remember that each test method is isolated from the other test methods: there is no mechanism to communicate values between the methods. So each method needs to setup its own environment.
(The @TestSetup annotation allows some shared data setup to be done but references to that data need to be queried in each test method.)