You can use private, public, or global for classes annotated with @isTest. This allows you to share functions between classes:
private: No outside class can access the class, but you can run test methods on this class.
public: You can provide shared methods, such as TestUtil class, to provide standard functionality to all your tests. The most usual case is a suite of methods for creating accounts, contacts, etc in a standardized format for testing. If this is a managed package, these methods are not visible outside the package.
global: You can provide shared methods, such as a TestControl class, to provide standard functionality to all your tests and your clients' tests. The usual case is when you want to provide hooks for your clients to use during testing, such as disabling asynchronous (@future, Queueable) calls, which can cause problems in test methods, or even completely disabling triggers virtually for the purposes of testing. Sadly, I've never seen developers do this, which leads to many questions here and elsewhere about how to manage the situation. Outside of managed code, public and global are effectively the same, which is why public is normally the value you'd want to use over global. Global is more of interest to ISV developers.