Question: For example,

x: `My shop of 23 items came to 54`

turns into 

`My shop of 46 items came to 108`

where x is a string

Answer: 
The short answer is no.

Testing a function depends on the ability to 

1. observe changes caused by the function to the state of the program or
2. access the return value of the function.

So, if a function's behavior changes the state of a program and we need to test this behavior, then we need to be able to access the part of the state that is changed to test the corresponding behavior. Such tests may not always rely on the return value of the function. Hence, functions need not return value to be testable but they do need to expose information pertaining to their behaviors that need to be tested.

For more on this aspect of testing, read about test doubles. "Using test doubles" chapter about indirect inputs and outputs in "xUnit Test Patterns" book is a good reference.
No, it can have a side-effect and you test that side effect.

For example, consider a function which writes to a file. Errors are reported via exceptions. It has nothing to return. The unit test would invoke the function and check that the relevant file has been written to, as well as to induce various exceptions.

Another example is a method call which changes the state of an object. You call the method and check that the object's state has changed.