Can I test if a file exists?

Yes, you can:

\IfFileExists{filename}{true-branch}{false-branch}

Notice that this looks for the file in all search pathes of LaTeX, so not only in the current directory, but in the texmf tree as well. Therefore, you can use it for instance for a "poor man's solution" when a package is missing:

\IfFileExists{upgreek.sty}{\usepackage{upgreek}}{\let\upmu\mu}

If you really want to search only in the current directory, you can do so by saying

\IfFileExists{./filename}{true-branch}{false-branch}

The question was not limited to LaTeX here but the answer here is only usable in LaTeX. I add other alternatives.

At TeX primitive level:

\openin15=filename   % or \openin15=./filename for current directory only
\ifeof15           ... file does not exist
\else\closein15    ... file exists
\fi

You can allocate the input file descriptor (15 here) by Plain TeX macro \newread. It means tat more common is: \newread\testfile, \openin\tesfile=filename and \ifeof\testfile.

The main point is that TeX allows to do \openin of non-existed file, but it returns true when \ifeof is used before first \read. On the other hand, if the file exists and it is empty, then first \ifeof returns false, first \read defines empty macro and the \ifeof (used after this \read) returns true.

Notice: All TeX engines since 2020 allow alternative syntax \openin15={\filename} which is incompatible with TeX 82 but allows to use spaces in file names.

If you are using OpTeX then there is a macro \isfile for doing this task:

 \isfile{filename}\iffalse ...file doesn't exist...\fi
 or
 \isfile{filename}\iftrue  ...file do exist...\fi
 or
 \isfile{filename}\iftrue  ...file do exist...\else ...file doesn't exist...\fi