(With more recent releases of the LaTeX 2ε-kernel, \IfBlankTF can be used instead of loadng the package etoolbox and using its \ifblank.)
xcolor lets you do this:
\documentclass{report}
\usepackage{xcolor}
\usepackage{etoolbox}
\NewDocumentCommand{\testinga}{D<>{red} O{blue} D(){green} m m m}{%
\textcolor{\ifblank{#1}{red}{#1}}{#4}%
\textcolor{\ifblank{#2}{blue}{#2}}{#5}%
\textcolor{\ifblank{#3}{green}{#3}}{#6}%
}
\parindent0pt
\begin{document}
All seven empty option cases are tested here:
\testinga<yellow>[purple](){test1}{test2}{test3}
\testinga<yellow>[](purple){test1}{test2}{test3}
\testinga<>[yellow](purple){test1}{test2}{test3}
\testinga<yellow>[](){test1}{test2}{test3}
\testinga<>[yellow](){test1}{test2}{test3}
\testinga<>[](yellow){test1}{test2}{test3}
\testinga<>[](){test1}{test2}{test3}
\end{document}
Alternatively do:
\documentclass{report}
\usepackage{xcolor}
\usepackage{etoolbox}
\NewDocumentCommand{\testinga}{D<>{red} O{blue} D(){green} m m m}{%
\ifblank{#1}{\textcolor{red}}{\textcolor{#1}}{#4}%
\ifblank{#2}{\textcolor{blue}}{\textcolor{#2}}{#5}%
\ifblank{#3}{\textcolor{green}}{\textcolor{#3}}{#6}%
}
\parindent0pt
\begin{document}
All seven empty option cases are tested here:
\testinga<yellow>[purple](){test1}{test2}{test3}
\testinga<yellow>[](purple){test1}{test2}{test3}
\testinga<>[yellow](purple){test1}{test2}{test3}
\testinga<yellow>[](){test1}{test2}{test3}
\testinga<>[yellow](){test1}{test2}{test3}
\testinga<>[](yellow){test1}{test2}{test3}
\testinga<>[](){test1}{test2}{test3}
\end{document}
Or - if expandability is not needed - define your own xparse-argument-preprocessor for checking blankness:
\documentclass{report}
\usepackage{xcolor}
\usepackage{etoolbox}
% \edef-\unexpanded-thingie in case a mean user defines colors which
% have hashes in their names.
\newcommand\CheckBlank[2]{%
\edef\ProcessedArgument{%
\ifblank{#2}{\unexpanded{#1}}{\unexpanded{#2}}%
}%
}%
\NewDocumentCommand{\testinga}{%
>{\CheckBlank{red}}D<>{red}
>{\CheckBlank{blue}}O{blue}
>{\CheckBlank{green}}D(){green}
m m m
}{%
\textcolor{#1}{#4}%
\textcolor{#2}{#5}%
\textcolor{#3}{#6}%
}
\parindent0pt
\begin{document}
All seven empty option cases are tested here:
\testinga<yellow>[purple](){test1}{test2}{test3}
\testinga<yellow>[](purple){test1}{test2}{test3}
\testinga<>[yellow](purple){test1}{test2}{test3}
\testinga<yellow>[](){test1}{test2}{test3}
\testinga<>[yellow](){test1}{test2}{test3}
\testinga<>[](yellow){test1}{test2}{test3}
\testinga<>[](){test1}{test2}{test3}
\end{document}
If \textcolor was not a command where expansion of the argument denoting the name of the color is triggered, then with newer TeX-engines, where \expanded and \unexpanded are available, expansion of \ifblank before carrying out \textcolor could be triggered as follows:
\documentclass{report}
\usepackage{xcolor}
\usepackage{etoolbox}
\NewDocumentCommand{\testinga}{D<>{red} O{blue} D(){green} m m m}{%
\expanded{\noexpand\textcolor{\ifblank{#1}{\unexpanded{red}}{\unexpanded{#1}}}}{#4}%
\expanded{\noexpand\textcolor{\ifblank{#2}{\unexpanded{blue}}{\unexpanded{#2}}}}{#5}%
\expanded{\noexpand\textcolor{\ifblank{#3}{\unexpanded{green}}{\unexpanded{#3}}}}{#6}%
}
\parindent0pt
\begin{document}
All seven empty option cases are tested here:
\testinga<yellow>[purple](){test1}{test2}{test3}
\testinga<yellow>[](purple){test1}{test2}{test3}
\testinga<>[yellow](purple){test1}{test2}{test3}
\testinga<yellow>[](){test1}{test2}{test3}
\testinga<>[yellow](){test1}{test2}{test3}
\testinga<>[](yellow){test1}{test2}{test3}
\testinga<>[](){test1}{test2}{test3}
\end{document}
E.g., with older TeX-engines, where \expanded and probably \unexpanded are not available, expansion of \ifblank before carrying out \textcolor could be triggered via \romannumeral:
\documentclass{report}
\usepackage{xcolor}
\usepackage{etoolbox}
\csname @ifdefinable\endcsname\stopromannumeral{\chardef\stopromannumeral=0 }%
\NewDocumentCommand{\testinga}{D<>{red} O{blue} D(){green} m m m}{%
\expandafter\textcolor\expandafter{\romannumeral\ifblank{#1}{\stopromannumeral red}{\stopromannumeral #1}}{#4}%
\expandafter\textcolor\expandafter{\romannumeral\ifblank{#2}{\stopromannumeral blue}{\stopromannumeral #2}}{#5}%
\expandafter\textcolor\expandafter{\romannumeral\ifblank{#3}{\stopromannumeral green}{\stopromannumeral #3}}{#6}%
}
\parindent0pt
\begin{document}
All seven empty option cases are tested here:
\testinga<yellow>[purple](){test1}{test2}{test3}
\testinga<yellow>[](purple){test1}{test2}{test3}
\testinga<>[yellow](purple){test1}{test2}{test3}
\testinga<yellow>[](){test1}{test2}{test3}
\testinga<>[yellow](){test1}{test2}{test3}
\testinga<>[](yellow){test1}{test2}{test3}
\testinga<>[](){test1}{test2}{test3}
\end{document}
(In expl3, the L3 programming layer of LaTeX 2ε, the pair \romannumeral / \stopromannumeral is available as \exp:w / \exp_end: .)