It all depends on what kind of "testing" you want to do.
It is possible to disable all the I/O modules in the PLC program so that that they do not scan. Thus when you download your program, you are free to write values to the I/O registers without affecting the actual equipment, and without the actual equipment overwriting whatever values you want set.
You can get fancy and automate your simulation: when the motor output is ON, drive the Input from the Aux contact:
Motor1 Motor1_Aux
Local:O:0.0 Local:I:0.0
-----| |-----------( )
This sort of simulation logic looks "wrong" -- outputs driving inputs instead of the other way around -- but it's perfectly valid.
Analog signals can also be simulated: If valve XYZ is open, increase the Input signal by 1; if valve ZYX is open, decrease the value by 1. You can get as fancy as you want with this sort of thing, adding timers, proportional control, etc.
Put all this simulation code in it's own routine, so you can disable it easily.
I've simulated large processes with this technique, running dozens of batches and watching them on the HMI, long before the actual equipment is functional. You find lots of bugs this way, but keep in mind that your simulation will only be as good as your model: the laws of physics have the last say. And you have to be careful to recognize if the problem you see is with the regular code or the simulation logic.
But it's great not having to wait for an hour to get a tank up to temperature.