For ages I have used the "unsupported" yum update method documented here:
With the exception of the systemd debacle around about Fedora 16 or 17, this method has worked like a charm and kept systems on-line as much as possible. You do have to pay attention to dependencies and may have to resolve issues and restore packages, but it worked. I've had a few (virtual) machines that where upgraded using this method from Fedora 1 in a continuous chain to Fedora 23 (although systemd require some serious recovery efforts). For me this has been the best approach for remote systems (as in hours of driving time remote) where you simply can NOT have them off-line during the upgrade process. Fed-up, which was vastly superior to "preupgrade: was worthless to me because it used anaconda and took the machine off-line during the upgrade and, if anything goes wrong, you could get screwed real fast with a remote machine.
In addition to the straight forward manual "dnf --releasver=" method documented in that URL, the URL above points out that they have created a (YES UNSUPPORTED) script to automate most of it. That's the fedora-upgrade package. Yes it's "unsupported" but it should be supported. The only failures I've run into it are dependency errors that should not be in the rpm repos to begin with. Things like circular dependencies and broken obsolete dependencies. If they actually supported the fedora-upgrade process, they would be force to fix those broken dependencies. Fortunately, the problems been easy to work around and get a clean upgrade with virutally no downtime or loss of control of my remote servers. Just backup a database of your installed packages and delete any offending package (often rpmfusion) and then reinstall after the upgrade.