First off, no “speed test” app can ever be completely accurate. No matter what you’re paying your ISP for, they can only guarantee the speed of the first link from your home to the ISP’s central office. And even then, they may not be able to make guarantees (e.g., if you are using a cable modem, you share the cable’s physical capacity with everybody else who is connected to it, so your neighbors’ activity can impact your throughput.)
That having been said, every “speed test” app works in pretty much the same way. A remote server tries to send data to you as fast as it can. Software running on the remote server works in conjunction with software on your computer to compare the amount of data sent to the amount received (to detect lost data) and how much you received during the time of the test (to detect throughput). It should then do the same thing in reverse (where your computer sends data to the remote server).
This is inherently problematic, because you are not connected directly to the remote server. There will be multiple routers (maybe dozens) between your computer and the server, and congestion on any one of those links can skew the results.
Furthermore, the software itself (running on either end) may have limits that will become visible, especially if your connection speed starts approaching those limits.
Also, tests may test different scenarios - a single stream of data, or multiple simultaneous streams.
So…
A browser-based app like fast.com may produce different results from different browsers, because each browser may perform differently when running the JavaScript software driving the test.
If different browsers have different network configurations (like VPNs or Apple’s various private-browsing options), that can also skew the results. Some may introduce delays. They may be connecting to different servers, trying to figure out which one is closest to you. And they may filter or rate-limit the test traffic.
Different test apps (e.g., Netflix’s fast.com vs. Ookla’s SpeedTest apps) are going to generate different kinds of test traffic, and they will be communicating with different remote servers.
And intermittent congestion on the Internet is a fact of life. So simply running the same test multiple times, even a few minutes apart, may produce different results.
In other words, these tests shouldn’t be considered very reliable. They might be useful if you have a gross problem (e.g. you’re paying for 500 Gbit/s, but you’re only seeing 50), but aside from that, they’re really just for curiosity and bragging rights.