1. xUnit has compact API. NUnit has much more methods, attributes and syntax for fluent assertions.
Equal(2, a); // xUnit
Assert.That(a, Is.EqualTo(2)); // NUnit
2. xUnit calls constructor of test-class for each test method. In contrast, NUnit calls constructor once for entire test class.
Therefore, with NUnit you must setup your test in method, marked as [SetUp] attribute.
In xUnit following tests will pass, because tests are isolated from each other:
int _a = 3;
[Fact]
public void Test1() => Equal(3, _a++);
[Fact]
public void Test2() => Equal(3, _a++);
In NUnit following tests will fail:
int _a = 3;
[Test]
public void Test1() => Assert.That(_a++, Is.EqualTo(3));
[Test]
public void Test2() => Assert.That(_a++, Is.EqualTo(3)); // NUnit fails here
3. Difference in nuget structure
Many developers wish to use the xUnit or NUnit framework as a test runner, but with a different assertion library.
Acording to this page, developers can replace xUnit asserts with, for example, FluentAssertions.
In contrasr, NUnit is tightly coupled with NUnit.Asserts. You can add assertion library, but not replace.