On FreeBSD, the programs /bin/test and /bin/[ are identical (same hard link, meaning same executable). If you think about the syntax of an if statement in shell: "if [ $a -eq 0 ] ; then echo a is zero ; else a is not zero ; fi", it becomes clear why [ and test are the same command. It's one of those hacks from the days of Dennis and Ken: to implement the "if" statement in the shell, they wrote a little language interpreter called "test", which performs logical tests of its arguments, and knows how to evaluate expressions like "314159 -eq 0" or "-z foo" or "abc = def". Using string substitution (which is the shell's parser) and this little program together were enough to implement a rudimentary if statement (and while and do and ... lots of other things). To make the shell syntax look nicer, they simply hard linked the [ program to test, and taught it to consume the "]" argument. So the shell's grammar knows about tokens like if, then, else, and fi, and the ";" token to end lines early. The rest is done by literally executing the [ program.
And in the early days of Unix (when there were alternatives like VAX/VMS, PrimOS, RSX-11, and MVS or VM on a mainframe) this was one of the points of criticism of Unix: Unix was deadly slow, because (a) the shell needs to spawn a new process for every program it runs, while most other operating systems keep the shell running at all times in a protected memory space, and run other programs within the process context of the logged in user; and (b) because in shells scripts, nearly every word in the scripts is yet another program that needs to be run (with a process spawned), and even the if statement requires all that. (What other people call "spawn", Unix calls fork/exec). To address that (somewhat valid) criticism, the implementation of the Unix shell was changed to have built-in programs: the shell itself recognizes that "[" doesn't need to run a program of its own, and has an internal version. I think it was Steve Bourne's shell that introduced this concept. But again, this is a hack on top of another hack: While this made the shell faster, Unix could not just get rid of the /bin/test and /bin/[ executables, since people had gotten accustomed to using them. So now we have two versions of the [ command, one in the shell, and one as a standalone executable, and usually they are incompatible.
Somewhere in this mess, someone (don't know who, perhaps Dave Korn of ksh) introduced the concept of "[[", which still exists today in the bash and zsh shells (perhaps also in sh): If you use it in an if statement in this form "if [[ $a -eq 0 ]] ...", then you are guaranteed to get the built-in version of [, which has more features than the traditional [. So if you have two incompatible versions, you can even select which one you want, using obscure syntax.
The sane answer would have been to actually design the shell in the first place, and design how the shell interacts with user programs, and how to write shell scripts, instead of quickly hacking together the thing that required the least effort to code. Alas, we have to remember that for the last ~50 years, the most popular operating system is a research prototype from Bell Labs that was not intended for production use, but to do R&D with.
Sorry for being so negative tonight ... but at least I hope this historical excursion amused someone.